Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何获取列表项所包含的所有数据?_Android_Sqlite - Fatal编程技术网

Android:如何获取列表项所包含的所有数据?

Android:如何获取列表项所包含的所有数据?,android,sqlite,Android,Sqlite,我有一个非常复杂的列表项,如图所示。 它有标题、图像、分级(分级栏)、分级计数(文本视图)、收藏指示器(图像)、收藏计数(文本视图)、收藏指示器、收藏计数(文本视图)、收藏计数(文本视图)、试用指示器(图像)和试用计数(文本视图) 它通过此自定义游标适配器从sqlite db获取所有这些数据: public class RecListCursorAdapter extends CursorAdapter { public RecListCursorAdapter(Context conte

我有一个非常复杂的列表项,如图所示。

它有标题、图像、分级(分级栏)、分级计数(文本视图)、收藏指示器(图像)、收藏计数(文本视图)、收藏指示器、收藏计数(文本视图)、收藏计数(文本视图)、试用指示器(图像)和试用计数(文本视图)

它通过此自定义游标适配器从sqlite db获取所有这些数据:

 public class RecListCursorAdapter extends CursorAdapter {

public RecListCursorAdapter(Context context, Cursor c, int flags) {
    super(context, c, flags);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return LayoutInflater.from(context)
            .inflate(R.layout.list_item, parent, false);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    ImageView thumbImg = (ImageView) view.findViewById(R.id.avatar);
    ImageView favImg = (ImageView) view.findViewById(R.id.imageFav);
    ImageView likeImg = (ImageView) view.findViewById(R.id.imageLike);
    ImageView triedImg = (ImageView) view.findViewById(R.id.imageTried);

    thumbImg.setImageResource(cursor.getInt(cursor.getColumnIndex(DBHelper.REC_THUMB_ID)));

    if (cursor.getInt(cursor.getColumnIndex(DBHelper.REC_FAV)) == 1) {
        favImg.setImageResource(R.drawable.heart_on);
    }

    if (cursor.getInt(cursor.getColumnIndex(DBHelper.REC_LIKED)) == 1) {
        likeImg.setImageResource(R.drawable.thumb_on);
    }

    if (cursor.getInt(cursor.getColumnIndex(DBHelper.REC_TRIED)) == 1) {
        triedImg.setImageResource(R.drawable.tried_on);
    }

    TextView title = (TextView) view.findViewById(R.id.text_title);
    TextView favCnt = (TextView) view.findViewById(R.id.txtFavCnt);
    TextView likeCnt = (TextView) view.findViewById(R.id.txtLikeCnt);
    TextView triedCnt = (TextView) view.findViewById(R.id.txtTriedCnt);

    title.setText(cursor.getString(cursor.getColumnIndex(DBHelper.REC_NAME)));
    favCnt.setText(cursor.getString(cursor.getColumnIndex(DBHelper.REC_FAV_CNT)));
    likeCnt.setText(cursor.getString(cursor.getColumnIndex(DBHelper.REC_LIKE_CNT)));
    triedCnt.setText(cursor.getString(cursor.getColumnIndex(DBHelper.REC_TRIED_CNT)));

    RatingBar rating = (RatingBar) view.findViewById(R.id.list_ratingbar);
    rating.setRating(cursor.getFloat(cursor.getColumnIndex(DBHelper.REC_RATING)));
}
}
现在,我正在向一个查询数据库以再次获取相同数据的详细信息活动发送行id,这意味着我在数据库中查询了两次相同的数据

  listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Intent intent = new Intent(getActivity(), RecipeDetailActivity.class);
            intent.putExtra(RecipeDetailActivity.EXTRA_POSITION, String.valueOf(id));
            getActivity().startActivity(intent);
        }
    });
listView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Intent Intent=new Intent(getActivity(),RecipeDetailActivity.class);
intent.putExtra(RecipeDetailActivity.EXTRA_位置,String.valueOf(id));
getActivity().startActivity(意图);
}
});
我要做的是将数据从列表项发送到要显示的详细信息活动,以保存第二个查询

我认为我可以获得这些视图的引用并从中获取值,但这将是一个非常复杂的过程,因为有图像视图、文本视图和评级栏

当然,有一种更简单、更聪明的方法可以做到这一点,但我想不出来

我做了很多搜索,但运气不好

你能指导我在这里能做什么吗

选择1 没有测试

在适配器中添加一个方法,如下所示

public void getData(int position) {
    Cursor cursor = getCursor();
    int p = cursor.getPosition;
    cursor.moveToPosition(position);
    // ... get data here
    cursor.moveToPosition(p);
}
将返回类型更改为您喜欢的任何类型

选择2 从光标创建一个ArrayList,其中的模型可以是

class Model {
    public String title;
    public String image;
    public boolean rated;
    public int ratingCount;
    public boolean favorited;
    public int favoriteCount;
    public boolean liked;
    public int likeCount;
    public boolean tried;
    public int triedCount;
}

并在ListView中使用[ArrayAdapter(Context Context,int resource,int textViewResourceId,List objects)](,int,int,java.util.List))

聪明的方法是将Sqllite代码拆分为一个类来执行不同的功能,这样您就可以从任何活动中访问它们,而无需重复代码——用光标创建一个ArrayList,如果模型实例将数据存储在一行SQLite中,并在适配器中使用该ArrayList?@Tasos我已经在这样做了,这不是我不想重复的代码,而是再次查询数据库以获取相同的数据。您可以将此模型打包并直接发送到下一个活动,这显然比为每个需要的数据调用putExtra要好send@Sourabh我没弄清楚,你能给我一个代码片段来澄清一下吗?谢谢,我会试试,然后再给你回复。@Mohammad--我不会选择数组选项。重点是什么。假设您可以在“详细信息”页面中更新评级等,那么您必须将更改保存在阵列和数据库中,这样做更明智。你会得到更多code@Tasos我不想缩减代码,我想减少db查询的次数,因为这需要很多时间。而且你的观点也很好。@Mohammad--ah,现在有道理了。好吧,你想加快速度,然后使用一个URL的图像,并获得他们从网上,而不是存储在数据库中。它们无论如何都会被缓存,因此对URL的请求只会执行一次,其余时间将从缓存中执行,因此不会有任何网络请求。使用像毕加索一样的东西--@Mohammad--将它外包快100倍,尤其是当你有超过一百万张的唱片要看的时候--试试这个