【问题标题】:updating list view in android studio在 android studio 中更新列表视图
【发布时间】:2017-03-15 05:25:09
【问题描述】:

我正在 android studio 中创建一个应用程序。

我需要使用通过短信发送的新网址更新 列表视图

如何将新的 url 添加到我的列表中?

这是我目前的主要代码。

 public class MainActivity extends AppCompatActivity {

 ListView list;
WebView webView;
ArrayList<String> sites = new ArrayList<> ("https://www.google.com", "https://www.yahoo.com", "https://www.apple.com");
String [] url = {"https://www.google.com", "https://www.yahoo.com", "https://www.apple.com"};

MyBroadcastReceiver receiver;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    list = (ListView)findViewById(R.id.listview);
    MyListAdapter adapter = new MyListAdapter(this, sites);
    sites.add("new site");
    adapter.notifyDataSetChanged();
    list.setAdapter(adapter);
    list.setDividerHeight(5);
    webView = (WebView)findViewById(R.id.webview);
    webView.setWebViewClient(new WebViewClient(){});

    list.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id){
            Toast.makeText(getApplicationContext(),sites[position], Toast.LENGTH_SHORT).show();
            webView.loadUrl("https://www.google.com");
            webView.loadUrl(url[position]);

        }
    });

    receiver = new MyBroadcastReceiver();
    IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
    registerReceiver(receiver,filter);
}


} 

我的列表适配器:

public class MyListAdapter extends ArrayAdapter<String> {
private Activity context_;
private ArrayList<String> sites;

//constructor
public MyListAdapter(Activity context, ArrayList<String> sites){
    super(context,R.layout.row,sites);
    context_ = context;
    this.sites = sites;
}

public View getView (int position, View convertView, ViewGroup parent){
    if(convertView == null){
        LayoutInflater inflater = context_.getLayoutInflater();
        convertView = inflater.inflate(R.layout.row,null);
    }

    ViewHolder holder = (ViewHolder) convertView.getTag();

    if(holder == null){
        holder = new ViewHolder(convertView);
        holder.tv_link.setText(sites.get(position));
    }
    else{
        holder.tv_link.setText(sites.get(position));
    }
    return convertView;
}

private class ViewHolder{
    TextView tv_link;
    public ViewHolder(View row){
        tv_link = (TextView) row.findViewById(R.id.tv_link);
    }
}

}

【问题讨论】:

  • 您应该发布 MyListAdapter 类的代码,但基本上您需要做的是向适配器添加一个方法,将新元素插入其站点列表,然后在其上使用 notifyDataSetChanged 进行更新意见。
  • 我已经添加了代码,我需要编辑其中的任何内容吗?如果是这样,我该怎么做?

标签: android listview notifydatasetchanged


【解决方案1】:

您将 sites 定义为 final,您也无法更新它,而不是 String[] 使用 String 的数组列表:

  ArrayList<String> sites = new ArrayList<>();

将适配器的构造函数更改为接受 ArrayList 而不是数组,并且在收到新数据时使用:

sites.add("new site !");
adapter.notifyDataSetChanged();

如果你这样做,在适配器的构造函数中:

  public class MyListAdapter extends ArrayAdapter<String> {

    private Context context;
    private ArrayList<String> array;

    public MyListAdapter(Context ctx, ArrayList<String> mArray) {
        super(ctx, 0, mArray);
        this.context = ctx;
        this.array = mArray; 
    }

    //other methods
}

adapter.notifyDataSetChanged();可以更新数据集和更新listView!

但如果你喜欢以下:

 public class MyListAdapter extends ArrayAdapter<String> {

    private Context context;
    private ArrayList<String> array;

    public MyListAdapter(Context ctx, ArrayList<String> mArray) {
        super(ctx, 0, mArray);
        this.context = ctx;
        for (int i = 0; i < mArray.size(); i++) // copy global ArrayList
            this.array.add(mArray.get(i));
    }

    //other methods
}

首先,你必须创建一个方法来更新Adapter的localDataset然后调用this.adapter.notifyDataSetChanged();

如下:

 public void newDataReceived(ArrayList<String> newArr){
            this.array.clear();
            for (int i = 0; i < newArr.size(); i++)
                this.array.add(newArr.get(i));

            this.notifyDataSetChanged();
        }

并在收到新数据时调用适配器方法!

 sites.add("new site ");
    adapter.newDataReceived(sites); 

代码是手动输入的,可能语法错误,希望对你有帮助

【讨论】:

  • 它说无法推断参数,无法解析此行中的构造函数:ArrayList sites = new ArrayList("google.com", "yahoo.com", "apple.com") ;
  • @S.Hobbs 取出所有分号,但最后一个
  • 我的应用程序中实际上没有分号,我不确定它们为什么存在。
  • @drawinfinity 我也已将我的适配器列表添加到上面的问题中,因为我不确定如何将我的适配器编辑为您所写的内容。你能解释一下吗?
  • 您必须在 onCreate 中一一输入地址:sites.add("google.com"); 或者像这样:sites = new ArrayList(Arrays.asList("google.com", "yahoo.com", "apple.com"));
【解决方案2】:

尝试使用 ArrayList,然后在需要在该 arrayList 中添加新 url 时添加。然后调用 adapter.notifyDataSetChanged()

如果您知道可能需要更新值,请不要使用 final

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多