标签: android-arrayadapter

ListView与ArrayAdapter和ViewHolder将图标添加到错误的项目

我有一个ListView使用动态的动态ArrayAdapter.当从微调器中选择一个名称时,该名称以及一个显示它们是男性还是女性的图标会被添加到ListView.

一切都很好(名称正确地添加到列表中,与图标一起).但是显示性别的图标被添加到了错误的项目中ListView.名称将添加到列表的底部,但图标将放置在列表顶部的名称处.我不知道这是否是我使用的方式,ViewHolderAndroid网站上没有文档.

// 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)

icons android android-arrayadapter android-listview

8
推荐指数
1
解决办法
2万
查看次数

在listview中回收视图,值得吗?

在Android listview上覆盖baseadapter时,必须实现此方法public View getView(int position, View convertView, ViewGroup parent).convertview是在滚动时先前从列表中推出的视图,它被赋予以便您可以重用该视图而不是创建新视图.

我的问题是,是否真的有必要重用视图?如果只更改了一段数据,我可以理解重用它.但创建视图的开销真的很重要吗?使用我见过的列表视图的每个教程都会告诉您回收视图,即使是像textview这样简单的简单视图.

我猜我的问题是谷歌为什么决定将此作为该getView方法的默认行为?

android listview android-arrayadapter

8
推荐指数
2
解决办法
7313
查看次数

覆盖Android ArrayAdapter

我想做一件非常简单的事情.我在我的应用程序中有一个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仍然有点新鲜.

谢谢!`

android listview android-arrayadapter

8
推荐指数
1
解决办法
2万
查看次数

ArrayAdapter:您必须为textview提供资源ID

我有一个应用程序,我想通过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)

sqlite android listview android-arrayadapter

8
推荐指数
1
解决办法
9852
查看次数

为什么做listview.setAdapter(_adapter)两次崩溃app?

我的关键问题是做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

8
推荐指数
1
解决办法
2713
查看次数

如何在ListView上设置一个侦听器,只要列表的数据发生变化就会触发该侦听器?

我有一个带有自定义适配器的ListView.我想在ListView中附加一个侦听器,只要ListView中的数据发生更改,就会触发该侦听器,因为这可能会发生多种各样的方式,而且每当ListView更新时我都需要另一个视图来更新.基本上我希望无论何时直接或间接调用notifyDataSetChanged()(通过add(),remove()等)都会触发它:

每当删除列表中的项目时,我希望触发该项目.每当一个项目被添加到列表中时,我希望它能够触发.等等

我是否必须创建自己的侦听器才能执行此操作(如果是,请简要说明如何提供帮助)或者是否有内置方式来侦听这些事件?

android android-arrayadapter android-listview

8
推荐指数
1
解决办法
5781
查看次数

AutoCompleteTextView未完成括号内的单词

我已经实现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件物品.

编辑:当我删除括号时,它正常工作.但我需要保留括号以供进一步使用.

android autocompletetextview android-arrayadapter

8
推荐指数
2
解决办法
6410
查看次数

IllegalStateException:适配器的内容已更改,但ListView未收到通知

我正在使用自定义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)

android filter android-arrayadapter

7
推荐指数
3
解决办法
4371
查看次数

在getView将其膨胀两次后更新第一个gridview元素

我正在视图持有者/适配器模式之后创建"文档"的网格视图.在活动中,我从网络类中获得回调,因此我需要能够在不同的时间更新每个网格单元.

我这样做的方法是通过从对象元素(文档)到相应的视图持有者的映射映射.我需要这样做,因为适配器正在循环使用单元格,所以有时我可以收到一个回调来更新一个不可见的单元格,在这种情况下,回调信息将被忽略.

我可以看到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)

android gridview adapter inflate android-arrayadapter

7
推荐指数
1
解决办法
1046
查看次数

如何在可搜索的微调器中使用SearchView.OnQueryTextListener()?

我正在使用第三方库创建一个可搜索的微调器.我在我的应用程序中添加了库类(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

7
推荐指数
2
解决办法
2194
查看次数