我正在开发一个Android应用程序,其中有一个名为Section的容器,里面可以有Note对象。用例是用户可以在一个部分中放置多个笔记并组织它们。目前,我将显示从服务器检索到的带有背景图像的部分名称。
现在我的问题是如何显示从该部分内的服务器收到的多个笔记。
我知道这可以通过FrameLayout实现,但动态Note计数就是我的问题所在。
请注意,笔记数量可能因用户而异。
以下是目前各个部分的原始屏幕截图:
现在,当您添加备注时,理想情况下应该如下所示:
该部分中的每个块都包含Note对象。为了显示它的内容,我想要显示一个音符块类型的图像和几个单词 注释内容。 目前我有代码从服务器检索Notes,可以显示部分,但我真的不知道如何继续,因为笔记可以是动态的。到目前为止,这是我的代码。
public class GroupSectionActivity extends Activity {
private SectionServiceImpl sectionService = new SectionServiceImpl();
private NoteServiceImpl noteService = new NoteServiceImpl();
private static volatile List<RestSection> restSectionList = new ArrayList<>();
private static volatile List<RestNote> restNoteList = new ArrayList<>();
private static volatile Long groupAccountId;
private static volatile Integer canvasid;
ListView listView;
SectionLazyAdapter sectionLazyAdapter;
static final String msectionname = "msectionname";
static final String msectionid = "msectionid";
Button addSectionButton;
EditText sectionName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sectionlayout);
Bundle extras = getIntent().getExtras();
if (extras != null) {
groupAccountId = extras.getLong("groupid");
canvasid = extras.getInt("canvasid");
}
restSectionList = this.sectionService.getSectionByCanvas(canvasid);
ArrayList<HashMap<String, String>> restSectionArrayList = new ArrayList<HashMap<String, String>>();
for (RestSection restSection : restSectionList) {
HashMap<String, String> sectionDisplay = new HashMap<>();
sectionDisplay.put("msectionid", String.valueOf(restSection.getMsectionid()));
sectionDisplay.put("msectionname", restSection.getMsectionname());
restSectionArrayList.add(sectionDisplay);
}
listView = (ListView) findViewById(R.id.seclist);
sectionLazyAdapter = new SectionLazyAdapter(this, restSectionArrayList);
listView.setAdapter(sectionLazyAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
int sectionId = restSectionList.get(position).getMsectionid();
Log.d("Sectionid is ", String.valueOf(sectionId));
/*Intent intent = new Intent(GroupSectionActivity.this, GroupSectionActivity.class);
intent.putExtra("groupid", groupAccountId);
intent.putExtra("sectionid", sectionId);
startActivity(intent);
finish();*/
}
});
BaseAdapter来管理这些人:
public class SectionLazyAdapter extends BaseAdapter{
private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public SectionLazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.activity_group_section, null);
TextView sectionName = (TextView)vi.findViewById(R.id.sectionname); // title
// ImageView sectionImage=(ImageView)vi.findViewById(R.id.sectionimage); // thumb image
HashMap<String, String> sectionList = new HashMap<String, String>();
sectionList = data.get(position);
// Setting all values in listview
sectionName.setText(sectionList.get(GroupSectionActivity.msectionname));
return vi;
}
}
activity_group_section.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="5dip" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:weightSum="1">
<ImageView
android:id="@+id/sectionimage"
android:layout_width="wrap_content"
android:layout_height="300dp"
android:scaleType="fitXY"
android:src="@drawable/sectionbackground"
/>
</FrameLayout>
<TextView
android:id="@+id/sectionname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/textView"
android:visibility="visible"
android:gravity="center"
android:layout_gravity="center_horizontal" />
</LinearLayout>
</RelativeLayout>
sectionlayout.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="{relativePackage}.${activityClass}" >
<ListView
android:id="@+id/seclist"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/sectionAddButton">
</ListView>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/sectionAddButton"
android:layout_alignParentTop="true"
android:background="@drawable/sectionbackground"
android:text="Add Section" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/sectionNameTextField"
android:layout_alignBottom="@+id/sectionAddButton"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_toEndOf="@+id/sectionAddButton"
android:hint="Section Name"
android:gravity="center"
android:layout_toRightOf="@+id/sectionAddButton" />
</RelativeLayout>
我希望问题很清楚,如果遗漏了什么,请告诉我。
答案 0 :(得分:2)
如果要以动态方式显示注释,则应在每个容器中实现GridView,如果为Grid内的每个注释设置了右边距,则组件将自身标注以适合您的部分。
GridView适配器非常简单,就像ListView适配器一样,您只需要定义列数,您可以在XML中执行此操作,也可以在Java代码中以编程方式执行此操作。
<GridView
android:id="@+id/grid_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="3"/>
答案 1 :(得分:1)
首先让我指出Thomaz是对的,你应该使用GridView
这是满足您的需求和易用性的正确方法,但更重要的是它能够回收它的视图。
如果您不使用任何形式的视图回收,则可能会出现内存异常。
但是现在你面临另一个问题:你想让它分段显示
为什么这是一个问题?这是因为:
A)ListView和GridView都使用子视图进行回收,现在ListView的每个子视图都是一个GridView,其中包含更多的Views,这是一个非常复杂的事情。不可能,但相当复杂
B)由于ListView和GridView都是可滚动的(并且由于这个事实是可循环使用的),因此滚动内部存在需要解决的滚动问题。
幸运的是,我找到了答案:SuperSLiM(正式StickyGridHeaders) 这应该为您提供一个满足您需求的简单解决方案 祝你好运。