繁体   English   中英

刷新列表视图(自定义适配器)

[英]Refresh List View (Custom adapter)

如何实时更新列表视图数据? 它只会在重新创建时刷新(如果我完成活动并重新启动它)。 但否则它不会自动刷新。

adapter.notifydatasetchange(); 根本不工作。 我尝试使用处理程序、按钮、列表项单击、选项菜单项单击、上下文菜单项单击,但我没有得到任何响应。 我认为这种方法行不通。

我的活动

String [] titles = {"List option 1","List option 2","List option 3"};
String [] descriptions = {updateDescription1(),updateDescription2(),updateDescription3()};
ListView lv;

public String updateDescription() {
    //live clock!!!!!!!!!!
    long time = System.currentTimeMillis();
    @SuppressLint("SimpleDateFormat") SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
    return sdf2.format(time);
    }

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);
        lv = (ListView) findViewById(R.id.listView);
        final UserAdapter adapter = new UserAdapter(getApplicationContext(), titles, descriptions);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            }
     });
}

我的适配器类

class UserAdapter extends ArrayAdapter {
    String[] titleArray;
    String[] descriptionArray;

public UserAdapter(Context context, String[] titles1, String [] description1) {
    super(context, R.layout.no_icon_list_row, R.id.noIconListDescriptions, titles1);
    this.titleArray = titles1;
    this.descriptionArray = description1;
}

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View row = inflater.inflate(R.layout.no_icon_list_row,parent,false);
    TextView myTitle = (TextView) row.findViewById(R.id.noIconListTitles);
    TextView myDescription = (TextView) row.findViewById(R.id.noIconListDescriptions);
    myTitle.setText(titleArray[position]);
    myDescription.setText(descriptionArray[position]);
    return row;
   }
}

现在,我无法更新描述文本; 我怎样才能实时更新它们?

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

View row = inflater.inflate(R.layout.no_icon_list_row,parent,false);

return row;
   } 
} 

不对。您可以在下面修改:

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

if(convertView == null){
      convertView = inflater.inflate(R.layout.no_icon_list_row,parent,false);
}

TextView myTitle = (TextView) convertView.findViewById (R.id.noIconListTitles);


return convertView, 
   } 

最后的。 如果您想刷新数据,只需调用adapter.notifyDataSetChanged希望对您有所帮助。

您可以在以下数组中添加数据并在列表视图上调用 notifyDataSetChanged 方法

String [] titles = {"List option 1","List option 2","List option 3" , "List option 4" , "List option 5"};
String [] descriptions = {updateDescription1(),updateDescription2(),updateDescription3() , updateDescription4() , updateDescription5()};

adapter.notifyDataSetChanged();
public String updateDescription() {
 //my update text data method
 adapter.notifyDataSetChanged();
 return text;
 }

这将通知您的数据已更改并将绘制所有项目。

我建议使用 recyclerview,因为您可以在那里指定已更改的项目,并且只有该项目将被重绘(重新绑定)。 使用notifyItemChanged(position)

您需要告诉您的适配器您进行了更改。 执行更新逻辑后,在适配器上调用此方法

adapter.notifyDataSetChanged()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM