我有一个带有ArrayAdapter的ListView,它包含一个带有Image和String的行.这工作正常,直到我决定图像的加载速度慢,所以我无法在显示列表之前加载图像.所以我开始使用一个单独的线程加载图像AsyncTask.
在我开始滚动列表之前,我对结果非常满意.加载了错误的图像,看起来这不是一段时间后图像的问题.如果我尝试对列表进行排序,则问题非常严重,并且没有任何图像位于右侧.
我做错了什么想法?
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ImageView imageView;
TextView textView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.drink_list_row, null);
}
Drink drink = allItems.get(position);
if (drink != null && v != null) {
imageView = (ImageView) v.findViewById(R.id.picture);
textView = (TextView) v.findViewById(R.id.drinkName);
imageView.setVisibility(View.GONE);
loadImageBitmap(drink, imageView);
textView.setText(drink.getName());
if (subItems != null && subItems.contains(drink)) {
textView.setVisibility(View.VISIBLE);
imageView.setVisibility(View.VISIBLE);
} else {
textView.setVisibility(View.GONE);
imageView.setVisibility(View.GONE);
}
}
return …Run Code Online (Sandbox Code Playgroud) android listview lazy-loading android-arrayadapter imageview
当我的项目包含英文和/或数字符号时,它会显示项目附近的无线电选择,但是当它不包含任何英文和/或数字符号(在我的示例中仅包含希伯来语)时,它不会显示附近的无线电选择这个项目.
对于适配器(数组适配器)创建,我使用了布局"android.R.layout.simple_spinner_item"
在设置Spinner适配器之前,我做了
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
Run Code Online (Sandbox Code Playgroud)
我现在找到的解决方案是将布局设置为"simple_dropdown_item_1line"; 这通过不显示单选按钮解决了问题.
关于如何让单选按钮始终可见的任何想法?
纠正 - 解决方案不起作用.对于我的几个微调器,它在白色背景上显示白色文本.
我正在创建列表视图布局并收到ArrayAdapter警告.错误消息如下.警告消息指向以下文本:
new ArrayAdapter(this, android.R.layout.simple_list_item_1, populateList());
Run Code Online (Sandbox Code Playgroud)
任何帮助都会有所帮助
警告信息:
说明资源路径位置类型ArrayAdapter是原始类型.对泛型类型ArrayAdapter的引用应该参数化为LoginList.java/LoginPlus/src/com/loginplus/home line 95 Java问题
@Override
protected void onResume() {
super.onResume();
loginListAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, populateList());
loginList.setAdapter(loginListAdapter);
}
Run Code Online (Sandbox Code Playgroud) 我已经对Java中的静态对象进行了大量的Google搜索,我想我了解它们在Android中是如何工作的.当应用程序的进程终止时,静态对象是GC,而不是当声明静态对象的Activity被销毁时(如果我错了,请纠正我).我有一个使用Tabhost的应用程序,其中包含Fragments.声明对象的Fragment一直到ViewPager的右边(有三个片段).右侧的选项卡有一个显示用户数据的ListView,我希望当用户浏览所有选项卡或导航离开应用程序时,该数据会持续存在.这些数据不需要保存,只需通过正常使用应用程序就可以保留在内存中.给我想要的结果的修复方法是为我的Array Adapter设置一个静态前缀.我的问题是,这被认为是好习惯吗?我知道不正确地使用静态对象会导致内存问题,但是我没有得到任何广泛使用的FC(一遍又一遍地横向画像,快速浏览选项卡,向ListView添加大量数据等).这是我正在使用的代码
static ArrayAdapter<String> arrayAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment,
container, false);
if (personList == null)
{
personList = new ArrayList<String>();
}
if (arrayAdapter == null)
{
arrayAdapter = new ArrayAdapter<String>
(getActivity().getApplicationContext(), android.R.layout.simple_list_item_1, personList);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
这就是我实现这个想法的方式.我在我的主Activity中有这个代码(父对象标签碎片.我把这个代码放在活动的onDestroy()方法中,试着回收一些内存.
@Override
protected void onDestroy() {
super.onDestroy();
if (arrayAdapter != null)
{
arrayAdapter.clear();
arrayAdapter = null;
Log.i("Activity", "Adapter nulled!");
}
Log.i("Activity", "Activityhas been destroyed");
}
public ArrayAdapter<String> getArrayAdapter(ArrayList<String> personList)
{
arrayAdapter = new ArrayAdapter<String>
(getBaseContext(), …Run Code Online (Sandbox Code Playgroud) lang.NullPointerException android.widget.ArrayAdapter.init(ArrayAdapter.java)只是将Arraylist值添加到customAdapter类中并将该值设置为listview,请参阅下面的代码helpm me
谢谢
private void fetchCallLogsDetails(String selectedId) {
this.SelectedLogId = selectedId;
new FetchCallLogDetailsAsyncTask() {
protected void onPostExecute(Boolean result) {
if (mCallLogModel.getmPhoto() != null) {
mCallLogPhoto.setImageBitmap(mCallLogModel.getmPhoto());
}
mCallLogDetailName.setText(mCallLogModel.getmName());
mCallLogDetailNumber.setText(mCallLogModel.getmNumber());
mCallLogDetailName.setTextSize(12);
mCallLogDetailNumber.setTextSize(10);
mLogAuditUtilList = mCallLogModel.getmLogAuditUtilList();
if (mLogAuditUtilList != null) {
mCallLogAuditArrayAdapter = new CallLogAuditArrayAdapter(
getActivity(), R.id.details_audit_log_list,
mLogAuditUtilList);
mAuditListView.setAdapter(mCallLogAuditArrayAdapter);
}
};
}.execute("");
}
class FetchCallLogDetailsAsyncTask extends
AsyncTask<String, Integer, Boolean> {
@Override
protected Boolean doInBackground(String... params) {
// reading call logs from contentReslover
mCallLogUtil = CallLogUtil.newInstance(mconContentResolver);
mCallLogModel = mCallLogUtil.selectedLogDetails(SelectedLogId);
return false;
}
} …Run Code Online (Sandbox Code Playgroud) 要有一个丰富多彩的ListView我已经创建了自己的ArrayAdapter,但是当我想要使用它adapter.clear()或adapter.add()它给我错误.这是代码和错误.
XML文件:
<ListView
android:id="@+id/android:list"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:padding="10dip"
android:layout_margin="4dip"
android:layout_weight="1">
</ListView>
Run Code Online (Sandbox Code Playgroud)
适配器:
class stableArrayAdapter extends ArrayAdapter<String> {
HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();
public stableArrayAdapter(Context context, int textViewResourceId, String [] objects)
{
super(context, textViewResourceId, objects);
for (int i = 0; i < objects.length; ++i) {
mIdMap.put(objects[i], i);
}
}
@Override
public long getItemId(int position) {
String item = getItem(position);
return mIdMap.get(item);
}
@Override
public boolean hasStableIds() {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
Java代码:
public class createtarget extends …Run Code Online (Sandbox Code Playgroud) 我创建了一个显示问题列表的自定义ArrayAdapter.我查询数据库,转换该数据,将数据传递给数组,然后将数组传递给ArrayAdapter以显示我的列表.
dbData = getDbData();
List<Question> questions = getQuestions(1L);
dbData.closeDb();
setContentView(R.layout.activity_questions);
adapter = new QuestionsAdapter(this, getCurrentContext(), questions, 1L, dbData);
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,您可以单击各种问题,操作一些东西并返回主列表.底层数组尚未更改,因为更改已在db中保留.我再次查询数据库,运行我的转换,然后我的数组是最新的.我在我的onResume()方法中执行此操作,但适配器将无法识别该notifyDataSetChanged()方法的任何更改.我onResume()看起来像这样:
@Override
protected void onResume() {
super.onResume();
dbData = getDbData();
questions = getQuestions(1L);
adapter = new QuestionsAdapter(this, getCurrentContext(), questions, 1L, dbData);
items.setAdapter(adapter);
}
Run Code Online (Sandbox Code Playgroud)
我必须查询数据库,进行转换,创建我的数组,然后为我的更改创建一个新的适配器以显示在主列表中.为什么我不能这样做:
@Override
protected void onResume() {
super.onResume();
dbData = getDbData();
questions = getQuestions(1L);
adapter.notifyDataSetChanges();
}
Run Code Online (Sandbox Code Playgroud)
我需要做些什么来完成这项工作?谢谢您的帮助.
我不明白为什么我得到这个错误!
public static class RoomsArrayAdapter<String> extends ArrayAdapter<String>{
****
private String rmName;
private ArrayList<String> st_list = new ArrayList<String>();
public View getView(int position, View convertView, ViewGroup parent){
View rowView = convertView;
LayoutInflater inflater = (LayoutInflater) raaContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(R.layout.room_layout, parent, false);
rmName = st_list.get(position).toString();
Run Code Online (Sandbox Code Playgroud)
rmName = st_list.get(position).toString();
有我的进口:
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.provider.Settings;
import android.util.Log;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; …Run Code Online (Sandbox Code Playgroud) 我正在使用一个片段来创建一个ListView填充CheckBoxes.我尽力找到基于其他问题的解决方案,但我似乎无法修复它.当我运行脚本而不使用:
convertView.getTag();
Run Code Online (Sandbox Code Playgroud)
我的应用程序运行正常,但列表中项目的位置不保存.视图项目跳转.但是,当我使用该方法时,我收到一个错误.日志猫说:
01-02 23:54:20.662: E/InputEventReceiver(1209): Exception dispatching input event.
01-02 23:54:20.672: D/AndroidRuntime(1209): Shutting down VM
01-02 23:54:20.672: W/dalvikvm(1209): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
01-02 23:54:20.782: E/AndroidRuntime(1209): FATAL EXCEPTION: main
01-02 23:54:20.782: E/AndroidRuntime(1209): java.lang.ClassCastException: com.MrBabilin.youdeserveadrink.Items cannot be cast to com.MrBabilin.youdeserveadrink.AlcoholList$MyCustomAdapter$ViewHolder
01-02 23:54:20.782: E/AndroidRuntime(1209): at com.MrBabilin.youdeserveadrink.AlcoholList$MyCustomAdapter.getView(AlcoholList.java:169)
01-02 23:54:20.782: E/AndroidRuntime(1209): at android.widget.AbsListView.obtainView(AbsListView.java:2255)
01-02 23:54:20.782: E/AndroidRuntime(1209): at android.widget.ListView.makeAndAddView(ListView.java:1769)
01-02 23:54:20.782: E/AndroidRuntime(1209): at android.widget.ListView.fillDown(ListView.java:672)
01-02 23:54:20.782: E/AndroidRuntime(1209): at android.widget.ListView.fillGap(ListView.java:636)
01-02 23:54:20.782: E/AndroidRuntime(1209): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5040)
01-02 23:54:20.782: …Run Code Online (Sandbox Code Playgroud) 我在Listview中显示我的SQLite数据库中的项目.对于添加项目,我使用AlertDialog.在ALertDialog中,我将项目保存在我的数据库中,并使用数据库中的数据刷新List(userLists).然后我使用notifyDataSetChanged但视图不会改变.
public class MediUserListsFragment extends Fragment {
private MediDAO mediDAO;
private ListView listView;
private List<UserList> userLists;
private ArrayAdapter<UserList> adapter;
@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
getActivity().setTitle("Medikamenten Listen");
final View view = inflater.inflate(R.layout.fragment_medi_user_list, container, false);
setHasOptionsMenu(true);
mediDAO = new MediDAO(getContext());
userLists = mediDAO.getAllUserList();
listView = (ListView) view.findViewById(R.id.list_view);
adapter = new ArrayAdapter<>(getContext(),android.R.layout.simple_list_item_1, userLists);
listView.setAdapter(adapter);
Button newLstBtn = (Button) view.findViewById(R.id.new_list_button);
newLstBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View alertLayout = inflater.inflate(R.layout.dialog_medi_list_new, null);
final EditText newLstName = …Run Code Online (Sandbox Code Playgroud)