ListView或LinearLayout - 动态创建按钮

时间:2014-12-16 00:42:26

标签: android listview android-linearlayout android-arrayadapter

当用户输入字词时,会创建Buttons - 每个字母一个Button

插图:

如果用户输入“so”,则会创建2 Buttons - 's','o'

如果用户输入“make”,则会创建4 Buttons - 'm','a','k','e'

我很难决定如何设计这个。最终我决定执行以下操作:将每个单词添加到垂直LinearLayout。对于每个单词,每个字母都会添加到水平LinearLayout。因此,LinearLayout方法中的LinearLayout

以下是我创建的代码:

     //creates words dynamically
     public void makeNewWord(LinearLayout ll, View v, EditText e){

        //the horizontal linear layout
        LinearLayout linearLayout2 = new LinearLayout(v.getContext());
        linearLayout2.setOrientation(LinearLayout.HORIZONTAL);

        //the parameters for the horizontal linear layout                  
        LinearLayout.LayoutParams rlp = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);    

        //e is the user input 
        int size = e.getText().toString().length();

        for (int i=0; i<size; i++){
             final Button dynamicButtons = new Button(v.getContext());
             dynamicButtons.setLayoutParams(rlp);

             //add the buttons to the horizontal linear layout 
             linearLayout2.addView(dynamicButtons, rlp);  
        }

        // ll is the vertical linear layout which I created in xml
        // so for each entered word, I am adding horizontal linear layouts to my vertical layout
        ll.addView(linearLayout2, 0);
    }

但是现在我意识到使用ListView可能更有效率,特别是因为我想使单词列表可扩展和可折叠。但是可以使用ListView创建上面的插图吗?我该怎么做?

我尝试按如下方式创建ArrayAdapterArrayAdapter<LinearLayout> adapter = new ArrayAdapter<LinearLayout>(this, R.id.listview)。所以基本上它是水平ListView的{​​{1}}。或者我应该LinearLayouts代替ArrayAdapter吗?什么是正确的方法?

3 个答案:

答案 0 :(得分:0)

您可以使用TableLayout。

的test.xml

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <TableLayout
        android:id="@+id/table_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </TableLayout>

</ScrollView>

活动代码

private TableLayout tableLayout;
private HashMap<String, TableRow> tableRows;

@Override
public void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.test);
    super.onCreate(savedInstanceState);

    tableLayout = (TableLayout) findViewById(R.id.table_layout);
    tableRows = new HashMap<String, TableRow>();
}

public void addWord(String word) {
    if (!tableRows.containsKey(word)) {
        TableRow tableRow = new TableRow(this);

        for (int i = 0; i < word.length(); i++) {
            String letter = String.valueOf(word.charAt(i));

            Button btnLetter = new Button(this);
            btnLetter.setText(letter);
            tableRow.addView(btnLetter);
        }

        tableRows.put(word, tableRow);
        tableLayout.addView(tableRow);
    }
}

public void removeWord(String word) {
    TableRow tableRow = tableRows.remove(word);

    if (tableRow != null) {
        tableLayout.removeView(tableRow);
    }
}

public void showWord(String word) {
    TableRow tableRow = tableRows.get(word);

    if (tableRow != null) {
        tableRow.setVisibility(View.VISIBLE);
    }
}

public void hideWord(String word) {
    TableRow tableRow = tableRows.get(word);

    if (tableRow != null) {
        tableRow.setVisibility(View.GONE);
    }
}

假设您想要一个特定的按钮设置,您可以动态地膨胀xml按钮布局。有关详细信息,请参阅here

答案 1 :(得分:0)

我可以提出一些想法,你可以在代码中改变这个想法

     1. onTextChanged() method try to get length of text.
     2. If you able to get text length then by subString() method get last entered text
     3. Then recreate new button instance 

答案 2 :(得分:0)

我只会使用每个单词的水平列表视图。 我想你想要创建一个自定义布局管理器和新的RecyclerView。

您单词的每个字符都是列表视图中的一个项目。然后布局可以只是一个按钮。

class ListAdapter extends BaseAdapter {

    private final Context fContext;
    private String mWord;

    public ListAdapter(Context context) {
        fContext = context;

    }

    public void updateWord(String word) {
        mWord = word;
        notifyDataSetChanged();
    }

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

    @Override
    public String getItem(int position) {
        return String.valueOf(mWord.charAt(position));
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Button button;
        if (convertView == null) {
            button = new Button(parent.getContext());

            LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            button.setLayoutParams(params);
        } else {
            button = (Button) convertView;
        }
        button.setText(getItem(position));
        return button;
    }
}

在每次文本更改后,您只需更新列表即可。

adapter.updateWord();

请注意代码只是我的头脑而已,我还没有对此进行过测试,但应该足以让你有所了解。