【问题标题】:Android Refresh ListActivity from BaseAdapter来自 BaseAdapter 的 Android 刷新 ListActivity
【发布时间】:2012-08-15 15:46:10
【问题描述】:

我有一个 ListActivity 和一个扩展 BaseAdapter 的自定义适配器。

ListView 的每一行都有一个按钮和几个视图。 onClickListener 在适配器中声明。

点击按钮后如何刷新列表视图?

这里是代码

列出活动:

 .........
 super.onCreate(savedInstanceState);


here im reading content from a file and then creating adapter with that content

     adapter = new UvArrayAdapter(this, strarray3, strarray2, intarray);
    setListAdapter(adapter);
 ..........

适配器:

.......

 public class UvArrayAdapter extends BaseAdapter {
 private Context mContext;
 private LayoutInflater linflater;
 private TextView txt_1, txt_2, txt_3;
 private ProgressBar pr1;
private String[] str1;
private String[] str2;
private String[] str3;
private Integer[] int1;

private class OnItemClickListener implements OnClickListener{       
    private int mPosition;
    OnItemClickListener(int position){
        mPosition = position;
    }
    @Override
    public void onClick(View arg0) {
        Log.v("TAG", "onItemClick at position" + mPosition);          
    }       
}



public UvArrayAdapter(Context context, String[] s1, String[] s2, Integer[] i1) {
mContext = context;
str1 = s1;
 str2 = s2;
int1 = i1;
linflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
return str1.length;
}

@Override
public Object getItem(int arg0) {
return str1[arg0];
}

@Override
public long getItemId(int arg0) {
return arg0;
}


@Override
public View getView(final int position, View convertView, ViewGroup parent) {

if (convertView == null) {

    convertView = linflater.inflate(R.layout.uv_rowlayout, null);

}
convertView.setOnClickListener(new OnItemClickListener(position));
txt_1 = (TextView) convertView.findViewById(R.id.textView1);
pr1 = (ProgressBar) convertView.findViewById(R.id.progressBar1);
pr1.setProgress(int1[position]);
txt_1.setText(str1[position]);

txt_2 = (TextView) convertView.findViewById(R.id.textView2);
txt_2.setText(str2[position]+"mV");
Button btn = (Button) convertView.findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener(){

    @Override
    public void onClick(View v) {
         Log.v("onClickListener", "button - clicked at position "             position);

        do some changes in mentioned file and after that i need to update the list view with new data
             }});




return convertView;

}



}

【问题讨论】:

标签: java android listview


【解决方案1】:
adapter.notifyDataSetChanged(); // to notify the adapter that your data has been updated

注意:如果上述行有任何错误,您可以尝试以下代码(其中 mListView 是我的 ListView 对象的名称)

((BaseAdapter) mListView.getAdapter()).notifyDataSetChanged(); 

另一种方法是使列表无效,以便再次从更新的数据集重新绘制它。

mListView=(ListView) findViewById(R.id.MyListView);
mListView.invalidate();

【讨论】:

  • 请给我一个例子,我不知道如何在我的代码中实现它
  • mListView=(ListView) findViewById(R.id.MyListView); mListView.invalidate();这就是您需要使用的所有内容,而不是 adapter.notifyDataSetChanged();
  • 确保您的 R.id.nameOfYourListViewInXML 在 findViewById 函数中是相同的。
  • mListView 是您的 ListView 在 java 代码中的名称。我猜因为您使用的是 ListActivity,所以您没有明确使用它。反正你只需要写ListView mListView; (作为您类中的数据成员)然后在 onCreate() 中添加此行 mListView=(ListView) findViewById(R.id.MyListView);
  • 在那种情况下,我不知道它是如何工作的。如果您想使其无效,我的建议是在您的 xml 中添加一个 ListView 并在您的 java 代码中引用它。
【解决方案2】:

使用notifyDataSetChanged()

adapter = new UvArrayAdapter(this, strarray3, strarray2, intarray);
setListAdapter(adapter);
UvArrayAdapter.notifyDataSetChanged(); 

// To make the adapter aware of the changes

【讨论】:

  • 再次出现同样的错误 无法从 BaseAdapter 类型对非静态方法 notifyDataSetChanged() 进行静态引用
猜你喜欢
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多