当用户输入字词时,会创建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
创建上面的插图吗?我该怎么做?
我尝试按如下方式创建ArrayAdapter
:ArrayAdapter<LinearLayout> adapter = new ArrayAdapter<LinearLayout>(this, R.id.listview)
。所以基本上它是水平ListView
的{{1}}。或者我应该LinearLayouts
代替ArrayAdapter
吗?什么是正确的方法?
答案 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();
请注意代码只是我的头脑而已,我还没有对此进行过测试,但应该足以让你有所了解。