Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.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使用GridView OnItemClick并在Adapter Only中查看长按_Android_Gridview - Fatal编程技术网

Android使用GridView OnItemClick并在Adapter Only中查看长按

Android使用GridView OnItemClick并在Adapter Only中查看长按,android,gridview,Android,Gridview,我需要使用GridView的帮助。 参见代码 首先,MainActivity.java public class MainActivity extends AppCompatActivity implements OnViewClickLitener { @BindView(R.id.grid_view) GridView gridView; private GridAdapter adapter; @Override protected void o

我需要使用GridView的帮助。
参见代码

首先,
MainActivity.java

public class MainActivity extends AppCompatActivity implements OnViewClickLitener {
    @BindView(R.id.grid_view)
    GridView gridView;

    private GridAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
    }

    private void initViews() {
        ButterKnife.bind(this);

        adapter = new GridAdapter(this);
        adapter.setOnViewClickListener(this);

        gridView.setAdapter(adapter);
    }

    @Override
    public void onViewClick(int position) {
        onItemClick(position);
    }

    @Override
    public boolean onViewLongClick(int position) {
        return onItemLongClick(position);
    }

    @OnItemClick(R.id.grid_view)
    void onItemClick(final int position) {
        if (adapter == null) {
            return;
        }

        Log.d(TAG, MainActivity.class.getSimpleName() + ".onItemClick() " + position);

        if (adapter.getMode() == Mode.EDIT) {
            Log.d(TAG, MainActivity.class.getSimpleName() + ".onItemClick() " + position + ": Edit Mode");

            adapter.setCheckedItem(position, !adapter.getCheckedItem(position));
            adapter.notifyDataSetChanged();
        } else {
            Log.d(TAG, MainActivity.class.getSimpleName() + ".onItemClick() " + position + ": Normal Mode");
        }
    }

    @OnItemLongClick(R.id.grid_view)
    boolean onItemLongClick(final int position) {
        if (adapter == null) {
            return true;
        }

        Log.d(TAG, MainActivity.class.getSimpleName() + ".onItemLongClick() " + position);

        if (adapter.getMode() == Mode.NORMAL) {
            Log.d(TAG, MainActivity.class.getSimpleName() + ".onItemLongClick() " + position + ": Edit Mode");

            setTitle("Edit");

            adapter.changeMode();
            adapter.setCheckedItem(position, !adapter.getCheckedItem(position));
            adapter.notifyDataSetChanged();
        }

        return true;
    }

    @Override
    public void onBackPressed() {
        if (adapter != null && adapter.getMode() == Mode.EDIT) {
            setTitle(getString(R.string.app_name));

            adapter.changeMode();
            adapter.initCheckedItems();
            adapter.notifyDataSetChanged();
        } else {
            super.onBackPressed();
        }
    }
}
public class GridAdapter extends BaseAdapter {
    private Context context;
    private LayoutInflater inflater;

    private Mode mode = Mode.NORMAL;

    private List<String> items = new ArrayList<>();
    private List<Boolean> checkedItems = new ArrayList<>();

    private OnViewClickListener listener;

    GridAdapter(Context context) {
        inflater = LayoutInflater.from(context);

        for (int i = 0; i < 10; i++) {
            items.add(String.valueOf(i + 1));
            checkedItems.add(Boolean.FALSE);
        }
    }

    public void setOnViewClickListener(OnViewClickListener listener) {
        this.listener = listener;
    }

    public Mode getMode() {
        return mode;
    }

    public void setCheckedItem(final int position, boolean checked) {
        checkedItems.set(position, checked);
    }

    public boolean getCheckedItem(final int position) {
        return checkedItems.get(position);
    }

    public void changeMode() {
        if (mode == null) {
            mode = Mode.NORMAL;
        } else if (mode == Mode.NORMAL) {
            mode = Mode.EDIT;
        } else {
            mode = Mode.NORMAL;
        }
    }

    public void initCheckedItems() {
        for (int i = 0; i < checkedItems.size(); i++) {
            checkedItems.set(i, Boolean.FALSE);
        }
    }

    @Override
    public int getCount() {
        return (items == null) ? 0 : items.size();
    }

    @Override
    public String getItem(final int position) {
        return (items == null) ? null : items.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (convertView != null && convertView.getTag() instanceof ViewHolder) {
            holder = (ViewHolder) convertView.getTag();
        } else {
            convertView = inflater.inflate(R.layout.grid_item, parent, false);
            holder = new ViewHolder(convertView);

            convertView.setTag(holder);
        }

        final String item = getItem(position);

        if (item == null) {
            initViews(holder);
        } else {
            drawLayout(holder, position);
            drawText(holder, item);
            drawDimmed(holder, position);
        }

        return convertView;
    }

    private void initViews(final ViewHolder holder) {
        if (holder == null) {
            return;
        }

        holder.itemLayout.setChecked(false);
        holder.text.setText(null);
        holder.dimmedLayout.setVisibility(View.GONE);
    }

    private void drawLayout(final ViewHolder holder, final int position) {
        if (holder == null) {
            return;
        }

        boolean checked = checkedItems.get(position);
        holder.itemLayout.setChecked(checked);
    }

    private void drawText(final ViewHolder holder, final String item) {
        if (holder == null) {
            return;
        }

        holder.text.setText(item);
    }

    private void drawDimmed(final ViewHolder holder, final int position) {
        if (holder == null) {
            return;
        }

        holder.dimmedLayout.setVisibility(View.VISIBLE);
        holder.dimmedLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mode == Mode.EDIT) {
                    if (listener != null) {
                        Log.d(TAG, GridAdapter.class.getSimpleName() + ".onClick() " + position);

                        listener.onViewClick(position);
                    }
                }
            }
        });
        holder.dimmedLayout.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (listener != null) {
                    Log.d(TAG, GridAdapter.class.getSimpleName() + ".onLongClick() " + position);

                    return listener.onViewLongClick(position);
                }

                return true;
            }
        });
    }

    /**
     * ViewHolder
     */
    static final class ViewHolder {
        @BindView(R.id.grid_item_layout)
        CheckableRelativeLayout itemLayout;

        @BindView(R.id.grid_item_text)
        TextView text;

        @BindView(R.id.dimmed_layout)
        ViewGroup dimmedLayout;

        ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }
    }
}
public interface OnViewClickLitener {
    void onViewClick(int position);
    boolean onViewLongClick(int position);
}
其次,
GridAdapter.java

public class MainActivity extends AppCompatActivity implements OnViewClickLitener {
    @BindView(R.id.grid_view)
    GridView gridView;

    private GridAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
    }

    private void initViews() {
        ButterKnife.bind(this);

        adapter = new GridAdapter(this);
        adapter.setOnViewClickListener(this);

        gridView.setAdapter(adapter);
    }

    @Override
    public void onViewClick(int position) {
        onItemClick(position);
    }

    @Override
    public boolean onViewLongClick(int position) {
        return onItemLongClick(position);
    }

    @OnItemClick(R.id.grid_view)
    void onItemClick(final int position) {
        if (adapter == null) {
            return;
        }

        Log.d(TAG, MainActivity.class.getSimpleName() + ".onItemClick() " + position);

        if (adapter.getMode() == Mode.EDIT) {
            Log.d(TAG, MainActivity.class.getSimpleName() + ".onItemClick() " + position + ": Edit Mode");

            adapter.setCheckedItem(position, !adapter.getCheckedItem(position));
            adapter.notifyDataSetChanged();
        } else {
            Log.d(TAG, MainActivity.class.getSimpleName() + ".onItemClick() " + position + ": Normal Mode");
        }
    }

    @OnItemLongClick(R.id.grid_view)
    boolean onItemLongClick(final int position) {
        if (adapter == null) {
            return true;
        }

        Log.d(TAG, MainActivity.class.getSimpleName() + ".onItemLongClick() " + position);

        if (adapter.getMode() == Mode.NORMAL) {
            Log.d(TAG, MainActivity.class.getSimpleName() + ".onItemLongClick() " + position + ": Edit Mode");

            setTitle("Edit");

            adapter.changeMode();
            adapter.setCheckedItem(position, !adapter.getCheckedItem(position));
            adapter.notifyDataSetChanged();
        }

        return true;
    }

    @Override
    public void onBackPressed() {
        if (adapter != null && adapter.getMode() == Mode.EDIT) {
            setTitle(getString(R.string.app_name));

            adapter.changeMode();
            adapter.initCheckedItems();
            adapter.notifyDataSetChanged();
        } else {
            super.onBackPressed();
        }
    }
}
public class GridAdapter extends BaseAdapter {
    private Context context;
    private LayoutInflater inflater;

    private Mode mode = Mode.NORMAL;

    private List<String> items = new ArrayList<>();
    private List<Boolean> checkedItems = new ArrayList<>();

    private OnViewClickListener listener;

    GridAdapter(Context context) {
        inflater = LayoutInflater.from(context);

        for (int i = 0; i < 10; i++) {
            items.add(String.valueOf(i + 1));
            checkedItems.add(Boolean.FALSE);
        }
    }

    public void setOnViewClickListener(OnViewClickListener listener) {
        this.listener = listener;
    }

    public Mode getMode() {
        return mode;
    }

    public void setCheckedItem(final int position, boolean checked) {
        checkedItems.set(position, checked);
    }

    public boolean getCheckedItem(final int position) {
        return checkedItems.get(position);
    }

    public void changeMode() {
        if (mode == null) {
            mode = Mode.NORMAL;
        } else if (mode == Mode.NORMAL) {
            mode = Mode.EDIT;
        } else {
            mode = Mode.NORMAL;
        }
    }

    public void initCheckedItems() {
        for (int i = 0; i < checkedItems.size(); i++) {
            checkedItems.set(i, Boolean.FALSE);
        }
    }

    @Override
    public int getCount() {
        return (items == null) ? 0 : items.size();
    }

    @Override
    public String getItem(final int position) {
        return (items == null) ? null : items.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (convertView != null && convertView.getTag() instanceof ViewHolder) {
            holder = (ViewHolder) convertView.getTag();
        } else {
            convertView = inflater.inflate(R.layout.grid_item, parent, false);
            holder = new ViewHolder(convertView);

            convertView.setTag(holder);
        }

        final String item = getItem(position);

        if (item == null) {
            initViews(holder);
        } else {
            drawLayout(holder, position);
            drawText(holder, item);
            drawDimmed(holder, position);
        }

        return convertView;
    }

    private void initViews(final ViewHolder holder) {
        if (holder == null) {
            return;
        }

        holder.itemLayout.setChecked(false);
        holder.text.setText(null);
        holder.dimmedLayout.setVisibility(View.GONE);
    }

    private void drawLayout(final ViewHolder holder, final int position) {
        if (holder == null) {
            return;
        }

        boolean checked = checkedItems.get(position);
        holder.itemLayout.setChecked(checked);
    }

    private void drawText(final ViewHolder holder, final String item) {
        if (holder == null) {
            return;
        }

        holder.text.setText(item);
    }

    private void drawDimmed(final ViewHolder holder, final int position) {
        if (holder == null) {
            return;
        }

        holder.dimmedLayout.setVisibility(View.VISIBLE);
        holder.dimmedLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mode == Mode.EDIT) {
                    if (listener != null) {
                        Log.d(TAG, GridAdapter.class.getSimpleName() + ".onClick() " + position);

                        listener.onViewClick(position);
                    }
                }
            }
        });
        holder.dimmedLayout.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (listener != null) {
                    Log.d(TAG, GridAdapter.class.getSimpleName() + ".onLongClick() " + position);

                    return listener.onViewLongClick(position);
                }

                return true;
            }
        });
    }

    /**
     * ViewHolder
     */
    static final class ViewHolder {
        @BindView(R.id.grid_item_layout)
        CheckableRelativeLayout itemLayout;

        @BindView(R.id.grid_item_text)
        TextView text;

        @BindView(R.id.dimmed_layout)
        ViewGroup dimmedLayout;

        ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }
    }
}
public interface OnViewClickLitener {
    void onViewClick(int position);
    boolean onViewLongClick(int position);
}
您可以构建此代码并长时间单击网格项。
查看奇怪的操作和日志?
我的案子记录是

我找不到这个问题的原因。
请帮忙。
谢谢。

您可以下载完整的源代码。这。到底是什么问题?@aborocz当我在ViewLongClick上触发时,在onItemLongClick之后发生了onItemClick事件。我只是想长点。