【问题标题】:Search Activity listview' s onitemclicklistener showing different information than expected搜索活动列表视图的 onitemclicklistener 显示的信息与预期不同
【发布时间】:2016-02-25 06:25:58
【问题描述】:

我在 activityA 中有一个列表视图,其中第一个列表项是测试标题 1,第二个项目是测试标题 2,第三个列表项是列表标题 8,列表标题 9,如下图所示

现在我在活动 A 中有一个按钮,它打开了新活动,即搜索活动,它从活动 A 的列表中搜索用户输入

到这里一切正常,但我在 searchactivity 中添加 onitemclicklistener 时遇到问题

问题是::

例如,如果用户在搜索活动的编辑文本中搜索列表,搜索结果将显示为包含单词列表的列表项,即

列出标题 8 列出标题 9 列出标题 10 列出标题 11 等等.... 如果用户单击列表标题 8 项,它应该打开单项视图和与列表标题 8 对应的数据,因为它会在活动 A 中显示,但它会在搜索活动中显示属于活动 A 的第一个列表项的数据,依此类推

它应该如何显示正确的单项视图数据以正确显示在搜索活动的搜索结果中的列表项

我的搜索活动

public class SearchActivity extends Activity implements OnItemClickListener
{

protected  EditText searchedittext;
ImageButton searchButton;
List<ParseObject> ob;
List<CodeList> codelist = null;
FinalAdapter fnladapter;

@Override
public void onCreate(Bundle savedInstanceState )
{
    // TODO: Implement this method
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search_layout);

    searchedittext = (EditText) findViewById(R.id.search_layoutEditText);

    final ListView searchedlist = (ListView) findViewById(R.id.searchlist);
    searchedlist.setOnItemClickListener(this);
    searchButton = (ImageButton) findViewById(R.id.searchlayoutbtn);

    searchButton.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v){
                String seaechedit = searchedittext.getText().toString();

                if(seaechedit.isEmpty()){

                    AlertDialog.Builder builder = new AlertDialog.Builder(SearchActivity.this);
                    builder.setMessage("PLEASE ENTER SOME SEARCH QUERY")
                        .setTitle("EMPTY SEARCH") 
                        .setPositiveButton(android.R.string.ok, null);

                    AlertDialog dialog = builder.create();
                    dialog.show();

                }
                else{
                    setProgressBarIndeterminateVisibility(true);
                    new RemoteDataTask().execute();
                    // InterActivity7 is the class name in parse database where listview retrives it data from
                    ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
                        "InterActivity");

                    query.whereContains("listheading", seaechedit);
                    query.orderByAscending("_created_at");
                    query.setLimit(200);

                    query.findInBackground(new FindCallback<ParseObject>() {

                            @Override
                            public void done(List<ParseObject> p1, ParseException e)
                            {
                                setProgressBarIndeterminateVisibility(false);

                                if(e == null){

                                    ob = p1;

                                    String [] searchHeadings = new String[ob.size()];

                                    int i = 0;

                                    // listheading is the coloumn name in parse database
                                    for(ParseObject heading : ob){ searchHeadings[i] = (String) heading.get("listheading");
                                        i++;

                                    }

                                    ArrayAdapter<String> adapter = new ArrayAdapter<String>( SearchActivity.this, android.R.layout.simple_list_item_1, searchHeadings );
                                    searchedlist.setAdapter(adapter);


                                }else{

                                    Log.e("searchactivity", e.getMessage()); 
                                    AlertDialog.Builder builder = new AlertDialog.Builder(SearchActivity.this); 
                                    builder.setMessage(e.getMessage()) 
                                        .setTitle("Nothing found")
                                        .setPositiveButton(android.R.string.ok, null); 
                                    AlertDialog dialog = builder.create();
                                    dialog.show();
                                }
                            }
                        });
                }


            }

        });

}

private class RemoteDataTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();



    }


    @Override
    protected Void doInBackground(Void... params) {
        // Create the array
        codelist = new ArrayList<CodeList>();
        try {
            // Locate the class table named "Country" in Parse.com
            ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
                "InterActivity");
            // Locate the column named "ranknum" in Parse.com and order list
            // by ascending
            query.orderByAscending("_created_at");

            ob = query.find();
            for (ParseObject inter : ob) {


                map.setIntroduction((String) inter.get("intro"));


                codelist.add(map);
            }
        } catch (ParseException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {


        fnladapter = new FinalAdapter(SearchActivity.this,
                                      codelist);

    }

}


@Override
public void onItemClick(AdapterView<?> p1, View p2, int position, long p4)
{
    ObjectMapper mapper = new ObjectMapper();
    CodeList codes = (CodeList) fnladapter.getItem(position);


    try{

        Intent intent = new Intent(SearchActivity.this, SingleItemView.class);

        String jsonString = mapper.writeValueAsString(codes);



        intent.putExtra("intro",
                        (codelist.get(position).getIntroduction()));



        // Start SingleItemView Class
        //   startActivity(intent);
        startActivityForResult(intent, 1);

    }catch(JsonProcessingException e){
        //something went w3ong
    }

    }
 }

【问题讨论】:

    标签: android listview search parse-platform onitemclicklistener


    【解决方案1】:

    使用id代替位置来获取数据

    改变

    CodeList codes = (CodeList) fnladapter.getItem(position);
    
    to
    CodeList codes = (CodeList) fnladapter.getItem((int)p4);
    

    【讨论】:

    • fnladapter.getitem() 只需要 int 不长
    • 您可以将 long 转换为 int。但问题是,如果您使用 id 来管理数据,那么您将如何存储数据,那么只有我的答案才有效
    • 你这只是我的问题
    • 祝一切顺利。如果可行,请接受我的回答。我还更新了我的回答以支持 int
    猜你喜欢
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多