删除Button Click上的Listview行

时间:2015-01-19 15:41:17

标签: android listview

我有一个Listview可以提供问题及其相应的选择:

enter image description here

以下构造函数获取了为Listview提供的所有必要信息。所有字符串值都在Arraylists中。

 public BaseQuestionAdapter(Activity a, ArrayList<String> b, ArrayList<String> c, ArrayList<String> d, ArrayList<String> e) {
        activity = a;
        this.questionTitleArray = b;
        this.choicesArray = c;
        this.questionIdArray = d;
        this.userIdArray = e;
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

每行将包含单个问题标题和可变数量的选项。动态创建的按钮将实例化选项,并在按钮开始生成的每个问题标题位置上。像这样,以下是BaseAdapter中的getView方法:

public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;

vi = inflater.inflate(R.layout.question_layout, null);

LinearLayout questionContainer = (LinearLayout) vi.findViewById(R.id.question_container);
LinearLayout choicesContainer = (LinearLayout) vi.findViewById(R.id.choices_container);

ViewGroup answersContainerParent = (ViewGroup) choicesContainer.getParent();
if (answersContainerParent != null)
    answersContainerParent.removeView(choicesContainer);

JSONArray choicesJSONArray = new JSONArray(choicesArray);

try {
    String bhb = choicesJSONArray.get(position).toString();
    jsnArray = new JSONArray(bhb);
} catch (JSONException e) {
    e.printStackTrace();
}

for (int answersArrayIterator = 0; answersArrayIterator < jsnArray.length(); answersArrayIterator++) {
    try {
        final Button choiceButton = new Button(activity);
        choiceButton.setId(buttonId);
        String questionId = questionIdArray.get(position).toString();

        choiceButton.setTag(questionId);
        choiceButton.setTag(position);

        ViewGroup layout = (ViewGroup) choiceButton.getParent();
        if (layout != null)
            layout.removeView(choiceButton);

        choiceButton.setText(jsnArray.get(answersArrayIterator).toString());
        choiceButton.setTextSize(16);
        choiceButton.setBackgroundResource(R.drawable.question_button_template_style);
        choiceButton.setGravity(Gravity.CENTER);
        choiceButton.setWidth(270);

        choiceButton.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                String choiceString = choiceButton.getText().toString();
                Object questionId = choiceButton.getTag();
                setDataToBeSent(userId, questionId, choiceString);

                Integer index = (Integer) v.getTag();
                System.out.println("SATURN ASCENDS: " + index);
                choicesArray.remove(index);
                notifyDataSetChanged();

                new HttpAsyncTask2().execute();

                return false;
            }
        });

        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.setMargins(10, 10, 10, 10);

        choiceButton.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        choiceButton.setLayoutParams(params);

        buttonId++;
        choicesContainer.addView(choiceButton);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

TextView questionTitleET = (TextView) vi.findViewById(R.id.question_title);
String questionTitle = questionTitleArray.get(position).toString();
questionTitleET.setText(questionTitle);

ViewGroup questionTitleETParent = (ViewGroup) questionTitleET.getParent();
if (questionTitleETParent != null)
questionTitleETParent.removeView(questionTitleET);

questionContainer.addView(questionTitleET);
questionContainer.addView(choicesContainer);

return vi;
}

我想要实现的是每当按钮被LonClicked时删除父Listview行。我试图通过在创建的每个按钮上设置OnLongClickListener来实现此目的。像这样:

choiceButton.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
    Integer index = (Integer) v.getTag();
    System.out.println("SATURN ASCENDS: " + index);
    choicesArray.remove(index);
    notifyDataSetChanged();

    return false;
}
});

问题在于我不知道要准确引用什么才能实现。不知道它是选择阵列还是我收到的任何其他资源。目前,当我长按一个按钮时,没有任何反应。关于我哪里出错的任何线索?谢谢。

1 个答案:

答案 0 :(得分:0)

正如Luksprog在评论中所说,你需要从getCount()中引用的容器中删除这些项目。不过我还想提供改进。而不是使用四个不同的字符串列表,使用一个Object来保存每个字符串。

例如

public class MyClass {
    public String questionTitle;
    public String choice;
    public String questionId;
    public String userId;
}

拥有此类后,您可以使用包含对象的单个列表。这样,您就不会混淆应该删除哪些列表项以便更改列表。