Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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
Java setOnClickListener返回正确的位置,但返回错误的项_Java_Android_Listview - Fatal编程技术网

Java setOnClickListener返回正确的位置,但返回错误的项

Java setOnClickListener返回正确的位置,但返回错误的项,java,android,listview,Java,Android,Listview,我花了整整一天的时间想弄明白怎么做才行。 我成功地设置了自定义适配器和我的列表视图。 问题是我找到了我单击的项目的正确位置,但该项目始终是列表中的最后一个项目。 更重要的是,我在另一个线程中调用所有这些来执行PostCall 我试着遵循其他的例子,当然也遵循官方的开发者资源,但是我不知道我做错了什么 protected void onPostExecute(String result) { try { ListView serviceList = (Lis

我花了整整一天的时间想弄明白怎么做才行。 我成功地设置了自定义适配器和我的
列表视图
。 问题是我找到了我单击的项目的正确位置,但该项目始终是列表中的最后一个项目。
更重要的是,我在另一个线程中调用所有这些来执行PostCall

我试着遵循其他的例子,当然也遵循官方的开发者资源,但是我不知道我做错了什么

protected void onPostExecute(String result) {
        try {
            ListView serviceList = (ListView)findViewById(android.R.id.list);

            String[] menu = result.split("_");
            ListaMenuActivity adapter = new ListaMenuActivity(ListaCibo.this, menu);
            serviceList.setAdapter(adapter);
            serviceList.setOnItemClickListener(new AdapterView.OnItemClickListener()
            {
                @Override
                public void onItemClick(AdapterView<?> parent, View view,int position, long id)
                {

                    Toast.makeText(ListaCibo.this, String.valueOf(position) + parent.getAdapter().getItem(position), Toast.LENGTH_SHORT).show();
             }
        }catch (Exception e){
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), R.string.error_string, Toast.LENGTH_LONG).show();

        }

    }

如果您的列表具有完整且正确的数据,并且您获得了正确的位置,那么您可以使用您获得的位置直接从列表中获取值。请尝试下面的代码片段

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {               
        String data = menu[position];
        Toast.makeText(ListaCibo.this, String.valueOf(position) + data, Toast.LENGTH_SHORT).show();
 }
@覆盖
public void onItemClick(AdapterView父对象、视图、int位置、长id){
字符串数据=菜单[位置];
Toast.makeText(ListaCibo.this,String.valueOf(position)+data,Toast.LENGTH_SHORT.show();
}

在getView中设置某些内容,然后在getItem()中设置

代码的工作方式(示例)

  • 您可以在屏幕上看到列表的第4项和第5项
  • 为位置=4调用适配器的getView
  • 您可以将适配器全局变量desc_piatto、nome_foto、nomepiatto和设置为项目编号4的数据
  • 立即调用位置为5的项目的getView
  • 您将全局变量设置为项目5的数据
  • 从onItemClick调用getItem,它返回适配器全局变量的最后一个值
  • 这是对适配器的getItem的错误使用。阅读有关ListView如何膨胀视图和适配器生命周期的内容

    注意:变量命名使用lowerCamelCase,适配器使用ViewHolder

    编辑: 更好,但不是最好的解决方案

    class YourAwesomeObject {
    
        String[] elems = null;
    
        public YourAwesomeObject(String inputString) {
            elems = inputString.split(", ");
        }
    
        public String getTitle() {
            return elems[0] + ", " + elems[2];
        }
    
        public String getExtraTxt() {
            return elems[1].replace("-", ", ");
        }
    
        public boolean isShowImage() {
            return !elems[3].equals("1");
        }
    
        public String getDescPiatto() {
            return elems[4];
        }
    
        public String getNomeFoto() {
            return elems[5];
        }
    
        public String getNomePiatto() {
            return elems[0];
        }
    
        @Override
        public String toString() {
            return getNomePiatto() + "," +getNomeFoto() + "," + getDescPiatto();
        }
    }
    
    public View getView(int position, View view, ViewGroup parent) {
    
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.menu_custom, null, true);
    
    
        TextView txtTitle = (TextView) rowView.findViewById(R.id.item);
        TextView extratxt = (TextView) rowView.findViewById(R.id.ingredienti);
        ImageView image = (ImageView) rowView.findViewById(R.id.vegan);
        try {
            if (itemname[position] != "Medium Text") {
                Log.e("basd", itemname[position]);
                YourAwesomeObject item = getItem(itemname[position])
                txtTitle.setText(item.getTitle());
                extratxt.setText(item.getExtraTxt());
    
                if (item.isShowImage()) {
                    Bitmap icon = BitmapFactory.decodeResource(context.getResources(),
                            R.drawable.leaf);
                    vegan.setImageBitmap(icon);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rowView;
    }
    
    @Override
    public YourAwesomeObject getItem(int position) {
        return new YourAwesomeObject(itemname[position]);
    }
    

    您应该将
    getItem
    重新编写为:

    @Override
    public String getItem(int position) {
        String [] elems = itemname[position].split(", ");
        return elems[0] + "," +elems[5] + "," + elems[4];
    }
    

    显示完整的代码。发布适配器。添加适配器的代码检查我的答案OK,这样可以工作,但是..我的代码不工作有什么原因吗?因为这是一种避免问题的方法,但我希望它能以应有的方式工作。。。。谢谢你指出了另一种方式,无论如何,我会使用它,直到我能让它正常工作。你的回答只是一个解决办法,让工作完成。它没有回答为什么它一开始不起作用。另外,我很确定,当有足够大的数据并快速滚动时,listview将会崩溃。此外,OP是紧密耦合的
    getView
    getItem
    方法,这是一种糟糕的做法。谢谢您的回答。我想我开始意识到问题的存在,但我仍然不知道如何解决这个问题,让它以这种方式工作。我是否应该直接从菜单中获取数据并使用它们,而不必来回?谢谢@Romadro,我想我已经解决了这个问题。因为我已经在那里有了菜单,所以我将从那里获取字符串,即使它不是最优雅的解决方案,也是目前唯一有效的解决方案。@Andrea如果您不想使用包装器YourAwesomeObject,那么请使用最简单且100%正确的Sumit Jha解决方案
    @Override
    public String getItem(int position) {
        String [] elems = itemname[position].split(", ");
        return elems[0] + "," +elems[5] + "," + elems[4];
    }