【问题标题】:not getting data from arraylist没有从arraylist获取数据
【发布时间】:2015-10-01 06:46:09
【问题描述】:

我有数组列表。我想要来自该数组列表的数据。我没有得到数据。相反,当我使用 arraylist.get(i) 时,我得到了整个 arraylist。

这是我的代码

这是我获取值并使用 putStringArrayListExtra 将其传递给下一个活动的主要活动。

   list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String varr = history.get(position).getLati().toString();
            ArrayList<String>clicklat=new ArrayList<String>();
            clicklat.add(varr);
            String var2 = history.get(position).getLongi().toString();
            ArrayList<String>clicklong=new ArrayList<String>();
            clicklong.add(var2);
            String var3 = history.get(position).getDatetime().toString();
            ArrayList<String>dttime=new ArrayList<String>();
            dttime.add(var3);

            Intent i = new Intent(HistoryActivity.this, DetailsActivity.class);
            i.putStringArrayListExtra("clicklat", clicklat);
            i.putStringArrayListExtra("clicklong", clicklong);
            i.putStringArrayListExtra("clickdatetime", dttime);
            startActivity(i);
        }
    });

这里是详细活动

   public class DetailsActivity extends AppCompatActivity {
private Toolbar toolbar;
String latitudee;
String longitudee;
String dateetime;
ArrayList<String> newLat;
ArrayList<String> newLong;
ArrayList<String> newDateTime;
ArrayList<DetailsPojo> details;
DetailsPojo detailsPojo;
DetailsAdapter adapter;
ListView detList;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);
    toolbar = (Toolbar) findViewById(R.id.app_bar);
    toolbar.setTitle("History Details");
    Intent intent = getIntent();
    details = new ArrayList<DetailsPojo>();
    newLat = new ArrayList<>();
    newLong = new ArrayList<>();
    newDateTime = new ArrayList<>();
    newLat = intent.getStringArrayListExtra("clicklat");
    newLong = intent.getStringArrayListExtra("clicklong");
    newDateTime = intent.getStringArrayListExtra("clickdatetime");
    for (int i = 0; i < newLat.size(); i++) {

        detailsPojo = new DetailsPojo();
        latitudee = newLat.get(i);
        longitudee = newLong.get(i);
        dateetime = newDateTime.get(i);
        Log.e("detais  latitude", "" + latitudee);
        Log.e("detailos  longitudee", "" + longitudee);
        Log.e("detailos  datetimeee", "" + dateetime);
        detailsPojo.setDetailsdatetime(dateetime);
        detailsPojo.setDetailslat(latitudee);
        detailsPojo.setDetailslong(longitudee);

    }
    details.add(detailsPojo);
    detList = (ListView) findViewById(R.id.detailsList);
    adapter = new DetailsAdapter(DetailsActivity.this, details);
    detList.setAdapter(adapter);
}

这是 DetailsAdapter

  public class DetailsAdapter extends BaseAdapter {
private Context activity;
TextView dt_datetime;
TextView dt_lat;
TextView dt_long;

ArrayList<DetailsPojo> list;
private ArrayList<DetailsPojo> arraylist = null;
public static LayoutInflater inflater;
private Context context;


public DetailsAdapter(Context a, ArrayList<DetailsPojo> details) {
    // TODO Auto-generated constructor stub
    activity = a;
    list = details;
    inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.arraylist = new ArrayList<DetailsPojo>();
    this.arraylist.addAll(list);

}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return list.size();
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return list.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View v = convertView;
    if(convertView == null) {
        v = inflater.inflate(R.layout.details_item, parent, false);
    }
    final DetailsPojo pojo = list.get(position);
    dt_datetime = (TextView) v.findViewById(R.id.detailsdatetime);
    dt_lat = (TextView) v.findViewById(R.id.detailslat);
    dt_long = (TextView) v.findViewById(R.id.detailslong);
    dt_datetime.setText(pojo.getDetailsdatetime());
    dt_lat.setText(pojo.getDetailslat());
    dt_long.setText(pojo.getDetailslong());
    return v;

}

}

这是数组列表

 latitude﹕ [21.121776, 21.121776, 21.121776, 21.121776, 21.121776, 21.121776, 21.121776, 21.121776, 21.121776, 21.121776, 21.121776, 21.121776, 21.121776, 21.121774, 21.121774]

更新:

这是 getLati 和 getLongi

  public List<String> getLati(){
    return this.lat;
}

public List<String> getLongi(){
    return this.longi;
}

public void setLati(List<String> lat){
    this.lat = lat;
}

public void setLongi(List<String> longi){
    this.longi = longi;

}

有什么问题吗?请帮帮我。

【问题讨论】:

  • 为什么要在项目点击时创建 Arraylist?如果您只需要传递单个项目,则只使用字符串。
  • @Pri 你应该打印数组列表的大小。 arraylist 的大小是否 > 0
  • @PhanVănLinh 我检查了数组列表的大小。它是 1
  • @Pri 所以你的列表视图只显示一项
  • @PhanVănLinh 我的列表将整个数组列表显示为一项

标签: java android arraylist


【解决方案1】:

试试这个代码:

    protected void onCreate(Bundle savedInstanceState) {
     ...
            for (int i = 0; i < newLat.size(); i++) {
                DetailsPojo detailsPojo = new DetailsPojo(); //changes here
                latitudee = newLat.get(i);
                longitudee = newLong.get(i);
                dateetime = newDateTime.get(i);
                Log.e("detais  latitude", "" + latitudee);
                Log.e("detailos  longitudee", "" + longitudee);
                Log.e("detailos  datetimeee", "" + dateetime);
                detailsPojo.setDetailsdatetime(dateetime);
                detailsPojo.setDetailslat(latitudee);
                detailsPojo.setDetailslong(longitudee);
                details.add(detailsPojo); // and here
            }
            detList = (ListView) findViewById(R.id.detailsList);
            adapter = new DetailsAdapter(DetailsActivity.this, details);
            detList.setAdapter(adapter);
     }

我在循环中声明了detailsPojo 对象而不是全局变量。

PS:确保newLongnewDateTime 的大小与newLat 相同,以避免出现IndexOutOfBoundsException。


更新: 将您的点击侦听器更改为:

      public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ArrayList<String>clicklat= new ArrayList<String>(history.get(position).getLati());

            ArrayList<String>clicklong= new ArrayList<String>(history.get(position).getLongi());

            ArrayList<String>dttime= new ArrayList<String>(history.get(position).getDatetime());

            Intent i = new Intent(HistoryActivity.this, DetailsActivity.class);
            i.putStringArrayListExtra("clicklat", clicklat);
            i.putStringArrayListExtra("clicklong", clicklong);
            i.putStringArrayListExtra("clickdatetime", dttime);
            startActivity(i);
      }

【讨论】:

  • 谢谢。我看到了我的错误
  • @Rami 我得到了正确的列表视图,但我得到相同的数据重复
  • @Pri 检查你的适配器数据,你应该有问题。
  • @Rami 是的,问题出在适配器上。你能看到我的另一个问题吗stackoverflow.com/questions/32862656/…
【解决方案2】:

HereActivity试试这个代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    for (int i = 0; i < newLat.size(); i++) {
            DetailsPojo detailsPojo = new DetailsPojo();
            latitudee = newLat.get(i);
            longitudee = newLong.get(i);
            dateetime = newDateTime.get(i);
            Log.e("detais  latitude", "" + latitudee);
            Log.e("detailos  longitudee", "" + longitudee);
            Log.e("detailos  datetimeee", "" + dateetime);
            detailsPojo.setDetailsdatetime(dateetime);
            detailsPojo.setDetailslat(latitudee);
            detailsPojo.setDetailslong(longitudee);
            details.add(detailsPojo); // move it to here
        }
      //  details.add(detailsPojo); // remove it
        detList = (ListView) findViewById(R.id.detailsList);
        adapter = new DetailsAdapter(DetailsActivity.this, details);
        detList.setAdapter(adapter);
    }
....

希望有帮助

【讨论】:

  • @Pri 我认为您的代码没有任何问题。您通过 Intent 放置了 3 个数组列表(但每个数组列表只有一项,您的数组列表只有一项,因为您只向其中添加一项)。然后在HereActivity 中,您将获得包含一项的列表 -> 您的列表视图包含一项
  • 那我该怎么做呢?
  • 为什么你定义 clicklatArrayList 而它只有一个项目。 clicklat你想要什么
  • @Pri 是的,PhanVănLinh 是对的...发布您的 getLati()、getLongi()... 方法,您需要更改它们以返回字符串数组,那么你就可以通过intent传递这个数组了。
  • @Rami 谢谢。你也帮助我认识到一些错误
【解决方案3】:

我认为这里的问题是您在 onClick 侦听器中创建列表。这意味着每次用户单击时都会创建一个新列表,然后添加值。所以你总是会得到 1 个大小的列表。如果您尝试在 1 大小的列表上使用 get(),您将获得唯一的元素,也就是整个列表。只需移动如下指令:

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

在听者之外,你应该没问题。

【讨论】:

  • 在此之后您是否仍然获得 1 项列表?
猜你喜欢
  • 2011-11-08
  • 2017-07-27
  • 2018-01-10
  • 1970-01-01
  • 2018-11-15
  • 2016-08-04
  • 1970-01-01
  • 2018-05-19
  • 2021-01-20
相关资源
最近更新 更多