我正在android中编写一个注释处理器来生成一个java文件。我正在使用public class GreenAdapter extends RecyclerView.Adapter<GreenAdapter.NumberViewHolder> {
private final String TAG = GreenAdapter.class.getSimpleName();
private int mNumberItems;
public GreenAdapter(int numberOfItems) {
mNumberItems = numberOfItems;
}
@Override
public NumberViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
Context context = viewGroup.getContext();
int layoutIdForListItem;
if (viewType==1) { layoutIdForListItem = R.layout.first; } else { layoutIdForListItem = R.layout.number_list_item; }
LayoutInflater inflater = LayoutInflater.from(context);
boolean shouldAttachToParentImmediately = false;
View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);
NumberViewHolder viewHolder = new NumberViewHolder(view);
return viewHolder;
}
@Override
public int getItemViewType(int position) {
int First;
switch (position) {
case 0: First=1;
break;
default:
First = 0;
}
return First;
}
@Override
public void onBindViewHolder(NumberViewHolder holder, int position) {
Log.d(TAG, "#" + position);
holder.bind(position);
}
@Override
public int getItemCount() {
return mNumberItems;
}
class NumberViewHolder extends RecyclerView.ViewHolder {
TextView listItemNumberView;
public NumberViewHolder(View itemView) {
super(itemView);
listItemNumberView = (TextView) itemView.findViewById(R.id.TV1);
}
void bind(int listIndex) {
//String[] messages = getResources().getStringArray(R.array.messageArray);
//listItemNumberView.setText(messages[listIndex]);
switch (listIndex) {
case 0: if (setStatusError) {Status="Cannot connect to eve-central";} listItemNumberView.setText(Status);
break;
case 1: listItemNumberView.setText(Buy[listIndex-1]+" "+Sell[listIndex-1]);
break;
case 2: listItemNumberView.setText(Buy[listIndex-1]+" "+Sell[listIndex-1]);
break;
default:listItemNumberView.setText(String.valueOf(listIndex));
}
}
}
}
库。
生成文件的目的: 它应该有一个具有我的处理器支持的特定注释的类的名称列表,并提供一个公共方法来获取该列表。
现在,我已经生成了文件:
JavaPoet
现在,问题是:如何从处理器初始化 private final List<String> names;
GeneratedFile(ArrayList<String> names) {
this.names = names;
}
public List<String> getNames() {
return names;
}
字段? names
api为字段提供Javapoet
,但只接受一个字符串。
在我的处理器中,我有支持注释的类列表。我想用该列表填充此字段。
答案 0 :(得分:0)
您已经知道,JavaPoet仅提供一个字符串来指定字段初始化。要完成您的任务,您必须(我将向您展示一些与您的问题无关的代码,但这可能是向您展示如何执行此操作的一个很好的示例):
从注释处理器获取带有注释的类列表(代码是从my library复制的):
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
model = new PrefsModel();
parseBindType(roundEnv);
// Put all @BindSharedPreferences elements in beanElements
for (Element item : roundEnv.getElementsAnnotatedWith(BindSharedPreferences.class)) {
AssertKripton.assertTrueOrInvalidKindForAnnotationException(item.getKind() == ElementKind.CLASS, item, BindSharedPreferences.class);
// store type name somewhere
}
return true;
}
使用这组TypeName为您的字段生成初始值:
...
Builder sp = FieldSpec.builder(ArrayTypeName.of(String.class), "COLUMNS", Modifier.STATIC, Modifier.PRIVATE,
Modifier.FINAL);
String s = "";
StringBuilder buffer = new StringBuilder();
for (SQLProperty property : entity.getCollection()) {
buffer.append(s + "COLUMN_" +
columnNameToUpperCaseConverter.convert(property.getName()));
s = ", ";
}
classBuilder.addField(sp.addJavadoc("Columns array\n").initializer("{" +
buffer.toString() + "}").build());
...
您将在github上找到我的图书馆。特别是,您必须阅读com.abubusoft.kripton.processor.sqlite.BindTableGenerator
类。
希望这些信息仍然有用。