Как я могу щелкнуть всю строку в действии списка с помощью пользовательского адаптера вместо только добавленного изображения?

#android #imageview #listactivity

#Android #просмотр изображений #listactivity

Вопрос:

Я создаю ListActivity, в котором есть только изображения в строках. Я уже могу отображать изображения, но когда я пытаюсь щелкнуть по строке, это ничего не дает. Я могу щелкнуть по добавленному изображению, но я хотел бы иметь возможность щелкнуть по всей строке, как при обычном действии списка. Кто-нибудь может сказать мне, как я могу это сделать? Не уверен, почему при возврате кода не отображается моя первая строка, но вот она:

До сих пор не удалось решить эту проблему. Кто-нибудь?

 public class AddNote extends ListActivity {

IconAdapter mAdapter;
private Button btnMove;
private Button btnDelete;
private Button btnSave;
private EditText etDescription;
private int iconPos = 0;
private String server;
private String project;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(this);
    final SharedPreferences.Editor editor = app_preferences.edit();
    setContentView(R.layout.add_note);
    mAdapter = new IconAdapter(this);
    setListAdapter(mAdapter);
    mAdapter.addIcons();
    btnMove = (Button) findViewById(R.id.move);
    btnDelete = (Button) findViewById(R.id.delete);
    btnSave = (Button) findViewById(R.id.save);
    etDescription = (EditText) findViewById(R.id.description);
    server = app_preferences.getString("server", "none");
    project = app_preferences.getString("project", "no project");

    btnMove.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.e("Move", "Move");
        }
    });

    btnDelete.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.e("Delete", "Delete");
        }
    });

    btnSave.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (etDescription.getText().toString().trim().equals(""))
                Toast.makeText(getApplicationContext(), "Please enter a description", Toast.LENGTH_SHORT).show();
            else
            {
                UUID id = UUID.randomUUID();
                saveMapIcon(id, iconPos, etDescription.getText().toString(), "0,0");
            }
        }
    });
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
    super.onListItemClick(l, v, position, id);
    Log.e("Test", "testing....");
    iconPos = position;
}

private void saveMapIcon(UUID theID, int position, String description, String location)
{
    SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = app_preferences.edit();

    String mapIcons = app_preferences.getString("mapNotes", "none");
    if (mapIcons.equals("none"))
    {
        mapIcons = server   "|"   project   "|"   theID   "|"   position   "|"   description   "|"   location   "*";
    }
    else
    {
        mapIcons  = server   "|"   project   "|"   theID   "|"   position   "|"   description   "|"   location   "*";
    }
    Log.e("position:", String.valueOf(position));
    editor.putString("idToMove", theID.toString()   "|"   String.valueOf(position));
    editor.putString("mapNotes", mapIcons);
    editor.putBoolean("addingIcon", true);
    editor.commit();
    Log.e("Test", mapIcons);

    Intent intent = null;
    intent = new Intent(getApplicationContext(), GetMap.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}

public class IconAdapter extends BaseAdapter {
    private Context mContext;
    ArrayList<View> imageViews = new ArrayList<View>();

    private Integer[] mIconList = {
            R.drawable.symbol1, R.drawable.symbol2, R.drawable.symbol3, R.drawable.symbol4, R.drawable.symbol5};

    private ArrayList<Integer> mIcons = new ArrayList<Integer>();

    public IconAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {
        return mIconList.length;
    }

    public Object getItem(int position) {
        return mIconList[position];
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView i = new ImageView(mContext);
        i.setImageResource(mIcons.get(position));

        return i;
    }

    public void addIcons() {        
        for (int i=0; i<mIconList.length; i  )
        {
            mIcons.add(mIconList[i]);
        }
        notifyDataSetChanged();
    }
}
  

}

Ответ №1:

Millec8,

Эта функциональность потребует от вас переопределения функции onListItemClick() в вашем ListActivity…

 @Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    //your code here
}    
  

Комментарии:

1. Я переопределил onListItemClick (), и он по-прежнему выбирает только изображение. Нужно ли мне отключить фокусировку или возможность выбора где-то еще, чтобы это сработало?

2. хммм, у меня есть пользовательский, ListView с 3 ImageViews , и я с этим не сталкивался. не могли бы вы опубликовать свой код для ListActivity ?

Ответ №2:

Кажется, что должен быть более простой способ сделать это, но из аналогичного вопроса, который у меня был с пользовательским ListView, я сделал следующее:

Создайте и замените ImageView новым пользовательским ImageView, что-то в этом роде:

 public class NoClickImageView extends ImageView {
    @Override
    protected void onKeyUp(int keyCode, KeyEvent event) {
        return false;
    }
    @Override
    protected void onKeyDown(int keyCode, KeyEvent event) {
        return false;
    }
    @Override
    protected void onTouchEvent(MotionEvent event) {
        return false;
    }
}
  

В принципе, сделайте его мертвым, где он не будет обрабатывать какие-либо события касания или щелчка. Если вам нужно, чтобы его можно было выбирать, вы можете добавить дополнительные методы, такие как setSelected() , а затем вызвать их в своем onListItemSelected() методе. Но я совершенно уверен, что использование вышеупомянутого должно сделать это.

Комментарии:

1. Я заменил ImageView, и он по-прежнему ведет себя таким же образом.

Ответ №3:

В итоге я создал holder в getView () моего ArrayAdapter и загрузил его с помощью ImageView. Я также поместил его в AlertDialog, потому что подозреваю, что у него могли возникнуть проблемы с одновременным отображением списка, а также других элементов графического интерфейса на экране.