【问题标题】:Custom BaseAdapter wont add new Data - Android自定义 BaseAdapter 不会添加新数据 - Android
【发布时间】:2013-08-21 22:02:38
【问题描述】:

我有一个自定义的 baseadapter,可以创建评论框。在我想添加数据之前,一切都很好。当我尝试添加数据时,它会删除以前的数据并添加新数据。如何制作它以保留所有数据?我的 Add 方法不正确吗?这是我的基本适配器,

class CreateCommentLists extends BaseAdapter{
  Context ctx_invitation;
  String[] listComments;
  String[] listNumbers;
  String[] listUsernames;

  public CreateCommentLists(String[] comments, String[] usernames, String[] numbers, DashboardActivity context)
  {
    super();
    ctx_invitation = context;
    listComments = comments;
    listNumbers = usernames;
    listUsernames = numbers;
  }

  @Override
  public int getCount() {
    if(null == listComments)
    {
      return 0;
    }   

    // TODO Auto-generated method stub
    return listComments.length;
  }

  @Override
  public Object getItem(int position) {
    // TODO Auto-generated method stub
    return listComments[position];
  }

  @Override
  public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
  }

  @Override
  public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View v = null;
    try
    {
      String inflater = Context.LAYOUT_INFLATER_SERVICE;
      LayoutInflater li = (LayoutInflater)ctx_invitation.getSystemService(inflater);
      v = li.inflate(R.layout.list_item, null);

      TextView commentView = (TextView)v.findViewById(R.id.listComment);
      TextView NumbersView = (TextView)v.findViewById(R.id.listNumber);
      TextView usernamesView = (TextView)v.findViewById(R.id.listPostedBy);
      Button usernameButton = (Button)v.findViewById(R.id.listUsernameButton);
      Button numberButton = (Button)v.findViewById(R.id.listNumberButton);

      commentView.setText(listComments[position]);
      NumbersView.setText(listNumbers[position]);
      usernamesView.setText(listUsernames[position]);
      usernameButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
          Intent i = new Intent(getApplicationContext(), ProfileActivity.class);
          i.putExtra("usernameOfProfile",listUsernames[position]);
          startActivity(i);
          finish();
        }
      });

      numberButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
          Intent i = new Intent(getApplicationContext(), ProfileActivity.class);
          i.putExtra("NumberProfile",listNumbers[position]);
          startActivity(i);
          finish();
        }
      });   
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
    return v;
  }

  public void add(String[] comments, String[] usernames,
                  String[] numbers) {
    listComments = comments;
    listNumbers = usernames;
    listUsernames = numbers;
  }

  public int getCount1() {
    if(null == listComments)
    {
      return 0;
    }   

    // TODO Auto-generated method stub
    return listComments.length;
  }

  public Object getItem1(int position) {
    // TODO Auto-generated method stub
    return listComments[position];
  }

  public long getItemId1(int position) {
    // TODO Auto-generated method stub
    return 0;
  }

  public View getView1(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View v = null;
    try
    {
      String inflater = Context.LAYOUT_INFLATER_SERVICE;
      LayoutInflater li = (LayoutInflater)ctx_invitation.getSystemService(inflater);
      v = li.inflate(R.layout.list_item, null);


      TextView commentView = (TextView)v.findViewById(R.id.listComment);
      TextView NumbersView = (TextView)v.findViewById(R.id.listNumber);
      TextView usernamesView = (TextView)v.findViewById(R.id.listPostedBy);
      Button usernameButton = (Button)v.findViewById(R.id.listUsernameButton);
      Button numberButton = (Button)v.findViewById(R.id.listNumberButton);

      commentView.setText(listComments[position]);
      NumbersView.setText(listNumbers[position]);
      usernamesView.setText(listUsernames[position]);

      usernameButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
          Intent i = new Intent(getApplicationContext(), ProfileActivity.class);
          i.putExtra("usernameOfProfile",listUsernames[position]);
          startActivity(i);
          finish();
        }
      });

      numberButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
          Intent i = new Intent(getApplicationContext(), ProfileActivity.class);
          i.putExtra("NumberProfile",listNumbers[position]);
          startActivity(i);
          finish();
        }
      });
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
    return v;
  }
}  

设置适配器:

final CreateCommentLists mycmlist = new CreateCommentLists(comments, usernames, numbers, DashboardActivity.this);

lstComments = (ListView)findViewById(android.R.id.list);

lstComments.setAdapter(mycmlist);

这就是我所说的 add 方法,

mycmlist.add(comments,usernames,numbers);
mycmlist.notifyDataSetChanged();

【问题讨论】:

  • it deletes the previous data and adds the new data 为保存数据的变量赋予全新的值时,您期望什么?
  • 那么如何正确使用add方法呢?
  • 我要做的是让这些数组中的每一个都成为自定义对象的属性,然后使用由List<CustomnObject> 支持的ArrayAdapter <CustomObject>。这样,你就有了一个可扩展的列表,而不是这个固定大小的数组废话。
  • 但我使用异步任务来收集变量(用户名、评论、号码)。 AsyncTask 一次收集每个变量的 8 个并将其存储到 String[] 中。所以我一次在一个字符串中发送 baseadapter 多个变量。如何使用 List 做到这一点?
  • 好吧,如果它收集了每个 var 的 8 个,那么没有什么能阻止你制作 8 个 CustomObjects 并将它们添加到 doInBackground() 中的 List。然后在onPostExecute循环遍历从doInBackground()返回的List并调用add()(或者addAll()在新的api版本上使用ArrayAdapter。正如我之前提到的,使用ArrayAdapter,它更容易。跨度>

标签: android android-listview baseadapter


【解决方案1】:

在您的 add 方法中,您将数组设置为新值 listComments = comments; 这就是用新数据替换旧数据。

您可以使用System.arrayCopy() 将您的 listArrays 调整为新大小并附加新项目。然而,一种不那么乏味的方法是将您的数组存储为List<String>,这样您就可以添加更多项目而不必担心调整列表大小。

结果看起来像这样......

public class CommentsAdapter extends BaseAdapter
{
private LayoutInflater inflater;

private List<String> comments;
private List<String> numbers;
private List<String> usernames;

public CommentsAdapter(Context context)
{
    inflater = LayoutInflater.from(context);

    comments = new ArrayList<String>();
    numbers = new ArrayList<String>();
    usernames = new ArrayList<String>();
}

public void add(String[] comments, String[] numbers, String[] usernames)
{
    this.comments.addAll(Arrays.asList(comments));
    this.numbers.addAll(Arrays.asList(numbers));
    this.usernames.addAll(Arrays.asList(usernames));

    notifyDataSetChanged();
}

@Override
public int getCount()
{
    if (comments == null)
        return 0;

    return comments.size();
}

@Override
public String getItem(int position)
{
    return comments.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    if (convertView == null)
    {
        convertView = inflater.inflate(R.layout.list_item, parent, false);
        convertView.setTag(new ViewHolder(convertView));
    }

    ViewHolder holder = (ViewHolder) convertView.getTag();
    holder.commentView.setText(comments.get(position));
    //Other view bind logic here...

    return convertView;
}

private static class ViewHolder
{
    public TextView commentView;
    public TextView numbersView;
    public TextView usernamesView;
    public Button usernameButton;
    public Button numberButton;

    public ViewHolder(View v)
    {
        commentView = (TextView) v.findViewById(R.id.listComment);
        numbersView = (TextView) v.findViewById(R.id.listNumber);
        usernamesView = (TextView) v.findViewById(R.id.listPostedBy);
        usernameButton = (Button) v.findViewById(R.id.listUsernameButton);
        numberButton = (Button) v.findViewById(R.id.listNumberButton);
    }
}
}

我还强烈建议您阅读 Android 开发者网站上的此页面:http://developer.android.com/training/improving-layouts/smooth-scrolling.html

您当前的适配器实现效率非常低,该页面应该可以帮助您解决一些问题。

【讨论】:

  • 使用示例实现更新答案:)
【解决方案2】:

您可能需要将String[] 数组添加到现有数组中,而不是替换它。

添加这个连接两个数组的函数(遗憾的是Java没有已经实现的方法):

String[] concat(String[] A, String[] B) {
   String[] C= new String[A.length + B.length];
   System.arraycopy(A, 0, C, 0, A.length);
   System.arraycopy(B, 0, C, A.length, B.length);
   return C;
}

致谢:Sun 论坛

然后将add方法改成这样:

public void add(String[] comments, String[] usernames,
                  String[] numbers) {
    listComments = concat(listComments, comments);
    listUsernames = concat(listUsernames, usernames);
    listNumbers = concat(listNumbers, numbers);
}

您的代码中有错字。在 add 方法中,listUsernameslistNumbers 应该交换我认为.. 我为你修好了。

【讨论】:

  • 感谢您纠正错字,但我认为这不能解决我的问题。
猜你喜欢
  • 2013-08-23
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多