我有一个ListView使用动态的动态ArrayAdapter.当从微调器中选择一个名称时,该名称以及一个显示它们是男性还是女性的图标会被添加到ListView.
一切都很好(名称正确地添加到列表中,与图标一起).但是显示性别的图标被添加到了错误的项目中ListView.名称将添加到列表的底部,但图标将放置在列表顶部的名称处.我不知道这是否是我使用的方式,ViewHolder但Android网站上没有文档.
// Listview inflater
inflater = (LayoutInflater) (this).getSystemService(LAYOUT_INFLATER_SERVICE);
// List Array.
mAdapter = new ArrayAdapter<String>(this, R.layout.player_simple_list,
R.id.label, mStrings) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i("ANDY","View getView Called");
// A ViewHolder keeps references to children views to
// avoid unneccessary calls to findViewById() on each row.
ViewHolder holder;
if (null == convertView) {
Log.i("ANDY","Position not previously used, so inflating");
convertView = inflater.inflate(R.layout.player_simple_list, null); …Run Code Online (Sandbox Code Playgroud) 在Android listview上覆盖baseadapter时,必须实现此方法public View getView(int position, View convertView, ViewGroup parent).convertview是在滚动时先前从列表中推出的视图,它被赋予以便您可以重用该视图而不是创建新视图.
我的问题是,是否真的有必要重用视图?如果只更改了一段数据,我可以理解重用它.但创建视图的开销真的很重要吗?使用我见过的列表视图的每个教程都会告诉您回收视图,即使是像textview这样简单的简单视图.
我猜我的问题是谷歌为什么决定将此作为该getView方法的默认行为?
我想做一件非常简单的事情.我在我的应用程序中有一个listview,我动态添加文本.但是,在某一点之后,我想改变listview中文本的颜色.因此,我创建了一个定义自定义列表项的XML,并将ArrayAdapter子类化.但是,每当我在自定义ArrayAdapter上调用add()方法时,项目就会添加到列表视图中,但文本不会放入其中.
这是我的XML:`
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_content" android:textSize="8pt"
android:gravity="center" android:layout_margin="4dip"
android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#FF00FF00"/>
Run Code Online (Sandbox Code Playgroud)
而我的ArrayAdapter子类:
private class customAdapter extends ArrayAdapter<String> {
public View v;
public customAdapter(Context context){
super(context, R.layout.gamelistitem);
}
@Override
public View getView(int pos, View convertView, ViewGroup parent){
this.v = convertView;
if(v==null) {
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v=vi.inflate(R.layout.gamelistitem, null);
}
if(timeLeft!=0) {
TextView tv = (TextView)v.findViewById(R.id.list_content);
//tv.setText(str[pos]);
tv.setTextColor(Color.GREEN);
}
else {
TextView tv = (TextView)v.findViewById(R.id.list_content);
//tv.setText(str[pos]);
tv.setTextColor(Color.RED);
}
return v;
}
}
Run Code Online (Sandbox Code Playgroud)
我确定我做的事情非常糟糕,但我对Android仍然有点新鲜.
谢谢!`
我有一个应用程序,我想通过SQLite数据库中的数据填充ListView ...在这部分我有一个问题,与arrayAdapter ...
这是我填充listView的方法代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
PetListView = (ListView)findViewById(R.id.list);
MyDatabaseHelper db = new MyDatabaseHelper(this);
String [] items = new String[100];
List<Pet> pets = db.getAllPets();
for (int i = 0; i < 10; i++) {
items[i] = pets.get(i).getName();
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.activity_list_item, R.id.textView1list, items);
PetListView.setAdapter(adapter);
}
Run Code Online (Sandbox Code Playgroud)
这是在我的数据库助手中实现的方法:
public List<Pet> getAllPets() {
List<Pet> petList = new ArrayList<Pet>();
String selectQuery = "SELECT * FROM " + TABLE_PETS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = …Run Code Online (Sandbox Code Playgroud) 我的关键问题是做lv_apps.setAdapter(_adapter)TWICE是我的应用程序崩溃的原因.(基本上,当我第二次调用populateListView_trial()时,应用程序崩溃 - 并且违规行是lv_apps.setAdapter(_adapter)
Stacktrace位于函数之下
private void populateListView_trial() {
blockedApps = loadArrayBlockedApps();
if(isTimerRunning()) {
blockedApps = loadArrayBlockedApps();
temp_blockedList = new ArrayAdapter<String>(
MainActivityCircularSeekbar.this,
android.R.layout.simple_list_item_1, blockedApps);
} else {
holder = new ArrayList<Datamodel>();
for(Map.Entry<String, String> entry : list_installedApps.entrySet()) {
Datamodel _appdata = new Datamodel();
_appdata.setAppname(entry.getKey());
_appdata.setSelected(true);
try {
_appdata.setAppIcon(getIconFromPackageName(entry.getValue(), this));
} catch (Exception e) {
e.printStackTrace();
} catch (OutOfMemoryError e) {
e.printStackTrace();
}
holder.add(_appdata);
}
_adapter = new MyAdapter(getApplicationContext(), holder);
try {
lv_apps.setAdapter(_adapter);
} catch (Exception e) …Run Code Online (Sandbox Code Playgroud) android listview android-arrayadapter android-listview baseadapter
我有一个带有自定义适配器的ListView.我想在ListView中附加一个侦听器,只要ListView中的数据发生更改,就会触发该侦听器,因为这可能会发生多种各样的方式,而且每当ListView更新时我都需要另一个视图来更新.基本上我希望无论何时直接或间接调用notifyDataSetChanged()(通过add(),remove()等)都会触发它:
每当删除列表中的项目时,我希望触发该项目.每当一个项目被添加到列表中时,我希望它能够触发.等等
我是否必须创建自己的侦听器才能执行此操作(如果是,请简要说明如何提供帮助)或者是否有内置方式来侦听这些事件?
我已经实现AutoCompleteTextView如下:
MainActivity.java
...
public static String[] myData=new String[]{"Africa (AF)","America (AFM)","Apple (AMP)"};
text=(AutoCompleteTextView)v.findViewById(R.id.first_state);
ArrayAdapter adapter = new ArrayAdapter(getActivity(),R.layout.autocompletetextview_row,R.id.textViewItem,myData);
text.setAdapter(adapter);
text.setThreshold(1);
text.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long rowId) {
selected_station = (String)parent.getItemAtPosition(position);
//TODO Do something with the selected text
}
});
Run Code Online (Sandbox Code Playgroud)
布局AutoCompleteTextView:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF"
android:padding="10dp" >
<TextView
android:id="@+id/textViewItem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:text="Item name here..."
android:textColor="#000000"
android:textSize="20sp" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
当我输入类似"af .."时,它显示非洲(AF)选择但不是美国(AFM).
数据只是一个示例数据.这不是我AutoCompleteTextView只用于3件物品.
编辑:当我删除括号时,它正常工作.但我需要保留括号以供进一步使用.
我正在使用自定义ArrayAdapter在AutocompleteTextView上设置适配器(AddressAdapter extends ArrayAdapter).
public class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable {
private ArrayList<String> mData;
ArrayList<String> listTempPrefix = new ArrayList<String>();
ArrayList<String> listTemp = new ArrayList<String>();
String valueText;
String[] words;
String ulcase;
public AutoCompleteAdapter(Context context, int textViewResourceId, ArrayList<String> bS) {
super(context, textViewResourceId);
mData = bS;//new ArrayList<String>();
}
@Override
public int getCount()
{
synchronized (listTempPrefix)
{
return listTempPrefix.size();
}
}
@Override
public String getItem(int index)
{
synchronized (listTempPrefix)
{
try {
//Log.e("Error", listTempPrefix.get(index));
return listTempPrefix.get(index);
} catch(IndexOutOfBoundsException e) {
Log.e("Error", "IndexOutOfBoundsException");
return ""; …Run Code Online (Sandbox Code Playgroud) 我正在视图持有者/适配器模式之后创建"文档"的网格视图.在活动中,我从网络类中获得回调,因此我需要能够在不同的时间更新每个网格单元.
我这样做的方法是通过从对象元素(文档)到相应的视图持有者的映射映射.我需要这样做,因为适配器正在循环使用单元格,所以有时我可以收到一个回调来更新一个不可见的单元格,在这种情况下,回调信息将被忽略.
我可以看到getView适配器的方法被多次调用为位置0.我一直在读这是正常的.
inflating position 0 *** progressBar 1
recycling position 0
recycling position 0
inflating position 0 *** progressBar 2
recycling position 0
recycling position 0
recycling position 0
recycling position 0
recycling position 0
recycling position 0
Run Code Online (Sandbox Code Playgroud)
UI我需要从回调中更新的一个元素是一个进度条,我通过添加viewHolder到与文档关联的Map来跟踪.
除了第一个方法之外,这整个方法适用于所有位置.我可以识别的唯一区别是这些多次调用,getView所以我从那里开始调试.在progressBar我更新为" progressBar2",这是最新的geView夸大,但实际上它并没有给回应setVisible(View.VISIBLE).然后我对代码进行了一些更改以更新" progressBar1"并且它可以工作.
这意味着getView相同位置膨胀两次,但第二次没有被使用或显示.
我能做错什么?为什么progressbar1工作而progressbar2没有?我希望这getView会给我一个与职位相对应的最新观点.
谢谢.
适配器:
public class DocumentPickerGridViewAdapter extends ArrayAdapter<Document> implements Filterable {
private final DocumentPickerGridViewController picker;
private ArrayList …Run Code Online (Sandbox Code Playgroud) 我正在使用第三方库创建一个可搜索的微调器.我在我的应用程序中添加了库类(SearchableListDialog,SearchableSpinner).一切都工作正常,但仍然是我面临的一个问题,例如,在搜索视图小部件中,如果我搜索Abc,我没有将结果过滤为Abc但是当点击列表视图项时,结果显示项目为ABC.这就像位置是项目的更改,但列表没有显示可搜索的结果.我不知道我哪里错了.我多次修改代码但没有得到理想的结果.
Searchable Spinner xml代码:
<com.example.my.currencyconverterapp.activity.SearchableSpinner
android:id="@+id/spinner"
android:layout_below="@+id/rl_currency_converterted_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Run Code Online (Sandbox Code Playgroud)
这是我的片段代码,我正在为可搜索的微调器设置适配器.
countriesCustomAdapterInr = new CountriesCustomAdapterInr(getActivity(), R.layout.custom_spinner_items, arrayList,res);
spinner.setAdapter(countriesCustomAdapterInr);
assert spinner != null;
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(getActivity(), ""+arrayList.get(i).getFull_name()+i, Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {}
});
Run Code Online (Sandbox Code Playgroud)
这是第三方SearchableSpinner类:
public class SearchableSpinner extends android.support.v7.widget.AppCompatSpinner implements View.OnTouchListener,
SearchableListDialog.SearchableItem {
public static final int NO_ITEM_SELECTED = -1;
private Context _context;
private List _items;
private SearchableListDialog _searchableListDialog;
private boolean _isDirty;
private ArrayAdapter _arrayAdapter; …Run Code Online (Sandbox Code Playgroud) android listview android-arrayadapter android-spinner searchview
android ×10
listview ×5
adapter ×1
baseadapter ×1
filter ×1
gridview ×1
icons ×1
inflate ×1
searchview ×1
sqlite ×1